diff options
Diffstat (limited to 'libjava/java/awt')
42 files changed, 2459 insertions, 1331 deletions
diff --git a/libjava/java/awt/AWTKeyStroke.java b/libjava/java/awt/AWTKeyStroke.java index 53e64b7..1519f1d 100644 --- a/libjava/java/awt/AWTKeyStroke.java +++ b/libjava/java/awt/AWTKeyStroke.java @@ -1,5 +1,5 @@ /* AWTKeyStroke.java -- an immutable key stroke - Copyright (C) 2002, 2004 Free Software Foundation + Copyright (C) 2002, 2004, 2005 Free Software Foundation This file is part of GNU Classpath. @@ -393,15 +393,16 @@ public class AWTKeyStroke implements Serializable * </code> * * @param s the string to parse + * @throws IllegalArgumentException if s is null or cannot be parsed * @return the specified keystroke - * @throws NullPointerException if s is null - * @throws IllegalArgumentException if s cannot be parsed */ public static AWTKeyStroke getAWTKeyStroke(String s) { + if (s == null) + throw new IllegalArgumentException("null argument"); StringTokenizer t = new StringTokenizer(s, " "); if (! t.hasMoreTokens()) - throw new IllegalArgumentException(); + throw new IllegalArgumentException("no tokens '" + s + "'"); int modifiers = 0; boolean released = false; String token = null; @@ -432,7 +433,8 @@ public class AWTKeyStroke implements Serializable KeyEvent.VK_UNDEFINED, modifiers, false); } - throw new IllegalArgumentException(); + throw new IllegalArgumentException("Invalid 'typed' argument '" + + s + "'"); } else if ("pressed".equals(token)) { @@ -453,8 +455,11 @@ public class AWTKeyStroke implements Serializable while (t.hasMoreTokens()); // Now token contains the VK name we must parse. Integer code = (Integer) vktable.get(token); - if (code == null || t.hasMoreTokens()) - throw new IllegalArgumentException(); + if (code == null) + throw new IllegalArgumentException("Unknown token '" + token + + "' in '" + s + "'"); + if (t.hasMoreTokens()) + throw new IllegalArgumentException("Too many tokens: " + s); return getAWTKeyStroke(KeyEvent.CHAR_UNDEFINED, code.intValue(), modifiers, released); } diff --git a/libjava/java/awt/BasicStroke.java b/libjava/java/awt/BasicStroke.java index e302a0eb..b177254 100644 --- a/libjava/java/awt/BasicStroke.java +++ b/libjava/java/awt/BasicStroke.java @@ -1,5 +1,5 @@ /* BasicStroke.java -- - Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -48,6 +48,7 @@ public class BasicStroke implements Stroke public static final int JOIN_MITER = 0; public static final int JOIN_ROUND = 1; public static final int JOIN_BEVEL = 2; + public static final int CAP_BUTT = 0; public static final int CAP_ROUND = 1; public static final int CAP_SQUARE = 2; @@ -208,11 +209,34 @@ public class BasicStroke implements Stroke return phase; } + /** + * Returns the hash code for this object. The hash is calculated by + * xoring the hash, cap, join, limit, dash array and phase values + * (converted to <code>int</code> first with + * <code>Float.floatToIntBits()</code> if the value is a + * <code>float</code>). + */ public int hashCode() { - throw new Error("not implemented"); + int hash = Float.floatToIntBits(width); + hash ^= cap; + hash ^= join; + hash ^= Float.floatToIntBits(limit); + + if (dash != null) + for (int i = 0; i < dash.length; i++) + hash ^= Float.floatToIntBits(dash[i]); + + hash ^= Float.floatToIntBits(phase); + + return hash; } + /** + * Returns true if the given Object is an instance of BasicStroke + * and the width, cap, join, limit, dash array and phase are all + * equal. + */ public boolean equals(Object o) { if (! (o instanceof BasicStroke)) diff --git a/libjava/java/awt/Button.java b/libjava/java/awt/Button.java index 86cb37c..0458ebb 100644 --- a/libjava/java/awt/Button.java +++ b/libjava/java/awt/Button.java @@ -47,7 +47,6 @@ import java.util.EventListener; import javax.accessibility.Accessible; import javax.accessibility.AccessibleAction; import javax.accessibility.AccessibleContext; -import javax.accessibility.AccessibleRelation; import javax.accessibility.AccessibleRole; import javax.accessibility.AccessibleValue; @@ -429,9 +428,18 @@ paramString() + getWidth () + "x" + getHeight () + ",label=" + getLabel (); } +/** + * Gets the AccessibleContext associated with this <code>Button</code>. + * The context is created, if necessary. + * + * @return the associated context + */ public AccessibleContext getAccessibleContext() { - return new AccessibleAWTButton(); + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTButton(); + return accessibleContext; } /** diff --git a/libjava/java/awt/Canvas.java b/libjava/java/awt/Canvas.java index d177c9b..05055f2 100644 --- a/libjava/java/awt/Canvas.java +++ b/libjava/java/awt/Canvas.java @@ -174,10 +174,7 @@ public class Canvas { /* Create the context if this is the first request */ if (accessibleContext == null) - { - /* Create the context */ - accessibleContext = new AccessibleAWTCanvas(); - } + accessibleContext = new AccessibleAWTCanvas(); return accessibleContext; } diff --git a/libjava/java/awt/Checkbox.java b/libjava/java/awt/Checkbox.java index 04ace46..b3fc4c2 100644 --- a/libjava/java/awt/Checkbox.java +++ b/libjava/java/awt/Checkbox.java @@ -48,6 +48,7 @@ import javax.accessibility.AccessibleAction; import javax.accessibility.AccessibleContext; import javax.accessibility.AccessibleRole; import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; import javax.accessibility.AccessibleValue; /** @@ -55,7 +56,7 @@ import javax.accessibility.AccessibleValue; * or more Checkboxes can be grouped by a CheckboxGroup. * * @author Aaron M. Renn (arenn@urbanophile.com) - * @author Tom Tromey <tromey@redhat.com> + * @author Tom Tromey (tromey@redhat.com) */ public class Checkbox extends Component implements ItemSelectable, Accessible, Serializable @@ -94,13 +95,38 @@ private boolean state; // The list of listeners for this object. private transient ItemListener item_listeners; -protected class AccessibleAWTCheckBox +/** + * This class provides accessibility support for the + * checkbox. + * + * @author Jerry Quinn (jlquinn@optonline.net) + * @author Andrew John Hughes (gnu_andrew@member.fsf.org) + */ +protected class AccessibleAWTCheckbox extends AccessibleAWTComponent implements ItemListener, AccessibleAction, AccessibleValue { - - /* (non-Javadoc) + /** + * Serialization constant to match JDK 1.5 + */ + private static final long serialVersionUID = 7881579233144754107L; + + /** + * Default constructor which simply calls the + * super class for generic component accessibility + * handling. + */ + public AccessibleAWTCheckbox() + { + super(); + } + + /** + * Captures changes to the state of the checkbox and + * fires appropriate accessible property change events. + * + * @param event the event fired. * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent) */ public void itemStateChanged(ItemEvent event) @@ -110,58 +136,121 @@ protected class AccessibleAWTCheckBox state ? AccessibleState.CHECKED : null); } + /** + * Returns an implementation of the <code>AccessibleAction</code> + * interface for this accessible object. In this case, the + * current instance is simply returned (with a more appropriate + * type), as it also implements the accessible action as well as + * the context. + * + * @return the accessible action associated with this context. + * @see javax.accessibility.AccessibleAction + */ public AccessibleAction getAccessibleAction() { return this; } + /** + * Returns an implementation of the <code>AccessibleValue</code> + * interface for this accessible object. In this case, the + * current instance is simply returned (with a more appropriate + * type), as it also implements the accessible value as well as + * the context. + * + * @return the accessible value associated with this context. + * @see javax.accessibility.AccessibleValue + */ public AccessibleValue getAccessibleValue() { return this; } - /* (non-Javadoc) + /* + * The following methods are implemented in the JDK (up to + * 1.5) as stubs. We do likewise here. + */ + + /** + * Returns the number of actions associated with this accessible + * object. This default implementation returns 0. + * + * @return the number of accessible actions available. * @see javax.accessibility.AccessibleAction#getAccessibleActionCount() */ public int getAccessibleActionCount() { - // 1.4.1 does this + // 1.4.1 and 1.5 do this return 0; } - /* (non-Javadoc) + /** + * Returns a description of the action with the supplied id. + * This default implementation always returns null. + * + * @param i the id of the action whose description should be + * retrieved. + * @return a <code>String</code> describing the action. * @see javax.accessibility.AccessibleAction#getAccessibleActionDescription(int) */ public String getAccessibleActionDescription(int i) { + // 1.5 does this return null; } - /* (non-Javadoc) + /** + * Executes the action with the specified id. This + * default implementation simply returns false. + * + * @param i the id of the action to perform. + * @return true if the action was performed. * @see javax.accessibility.AccessibleAction#doAccessibleAction(int) */ public boolean doAccessibleAction(int i) { + // 1.5 does this return false; } - /* (non-Javadoc) + /** + * Returns the current value of this accessible object. + * If no value has been set, null is returned. This + * default implementation always returns null, regardless. + * + * @return the numeric value of this object, or null if + * no value has been set. * @see javax.accessibility.AccessibleValue#getCurrentAccessibleValue() */ public Number getCurrentAccessibleValue() { + // 1.5 does this return null; } - /* (non-Javadoc) + /** + * Sets the current value of this accessible object + * to that supplied. In this default implementation, + * the value is never set and the method always returns + * false. + * + * @param number the new accessible value. + * @return true if the value was set. * @see javax.accessibility.AccessibleValue#setCurrentAccessibleValue(java.lang.Number) */ public boolean setCurrentAccessibleValue(Number number) { + // 1.5 does this return false; } - /* (non-Javadoc) + /** + * Returns the minimum acceptable accessible value used + * by this object, or null if no minimum value exists. + * This default implementation always returns null. + * + * @return the minimum acceptable accessible value, or null + * if there is no minimum. * @see javax.accessibility.AccessibleValue#getMinimumAccessibleValue() */ public Number getMinimumAccessibleValue() @@ -169,7 +258,13 @@ protected class AccessibleAWTCheckBox return null; } - /* (non-Javadoc) + /** + * Returns the maximum acceptable accessible value used + * by this object, or null if no maximum value exists. + * This default implementation always returns null. + * + * @return the maximum acceptable accessible value, or null + * if there is no maximum. * @see javax.accessibility.AccessibleValue#getMaximumAccessibleValue() */ public Number getMaximumAccessibleValue() @@ -177,11 +272,35 @@ protected class AccessibleAWTCheckBox return null; } + /** + * Returns the role of this accessible object. + * + * @return the instance of <code>AccessibleRole</code>, + * which describes this object. + * @see javax.accessibility.AccessibleRole + */ public AccessibleRole getAccessibleRole() { return AccessibleRole.CHECK_BOX; } + /** + * Returns the state set of this accessible object. + * + * @return a set of <code>AccessibleState</code>s + * which represent the current state of the + * accessible object. + * @see javax.accessibility.AccessibleState + * @see javax.accessibility.AccessibleStateSet + */ + public AccessibleStateSet getAccessibleStateSet() + { + AccessibleStateSet set = super.getAccessibleStateSet(); + if (state) + set.add(AccessibleState.CHECKED); + return set; + } + } /*************************************************************************/ @@ -490,11 +609,22 @@ paramString() + "," + super.paramString()); } +/** + * Gets the AccessibleContext associated with this <code>Checkbox</code>. + * The context is created, if necessary. + * + * @return the associated context + */ public AccessibleContext getAccessibleContext() { - AccessibleAWTCheckBox ac = new AccessibleAWTCheckBox(); - addItemListener(ac); - return ac; + /* Create the context if this is the first request */ + if (accessibleContext == null) + { + AccessibleAWTCheckbox ac = new AccessibleAWTCheckbox(); + accessibleContext = ac; + addItemListener(ac); + } + return accessibleContext; } } // class Checkbox diff --git a/libjava/java/awt/CheckboxMenuItem.java b/libjava/java/awt/CheckboxMenuItem.java index ab4cb60..6b9002a 100644 --- a/libjava/java/awt/CheckboxMenuItem.java +++ b/libjava/java/awt/CheckboxMenuItem.java @@ -43,6 +43,11 @@ import java.awt.event.ItemListener; import java.awt.peer.CheckboxMenuItemPeer; import java.util.EventListener; +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleAction; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleValue; + /** * This class implements a menu item that has a checkbox on it indicating * the selected state of some option. @@ -50,7 +55,8 @@ import java.util.EventListener; * @author Aaron M. Renn (arenn@urbanophile.com) * @author Tom Tromey <tromey@redhat.com> */ -public class CheckboxMenuItem extends MenuItem implements ItemSelectable +public class CheckboxMenuItem extends MenuItem + implements ItemSelectable, Accessible { /* @@ -268,6 +274,14 @@ processItemEvent(ItemEvent event) void dispatchEventImpl(AWTEvent e) { + if (e instanceof ItemEvent) + { + synchronized (this) + { + state = (((ItemEvent) e).getStateChange() == ItemEvent.SELECTED); + } + } + if (e.id <= ItemEvent.ITEM_LAST && e.id >= ItemEvent.ITEM_FIRST && (item_listeners != null @@ -315,5 +329,27 @@ paramString() { return (ItemListener[]) getListeners (ItemListener.class); } + + + protected class AccessibleAWTCheckboxMenuItem extends AccessibleAWTMenuItem + implements AccessibleAction, AccessibleValue + { + // I think the base class provides the necessary implementation + } + + /** + * Gets the AccessibleContext associated with this <code>CheckboxMenuItem</code>. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTCheckboxMenuItem(); + return accessibleContext; + } + } // class CheckboxMenuItem diff --git a/libjava/java/awt/Choice.java b/libjava/java/awt/Choice.java index 89e91ca..c6a532a 100644 --- a/libjava/java/awt/Choice.java +++ b/libjava/java/awt/Choice.java @@ -45,6 +45,7 @@ import java.io.Serializable; import java.util.EventListener; import java.util.Vector; +import javax.accessibility.Accessible; import javax.accessibility.AccessibleAction; import javax.accessibility.AccessibleContext; import javax.accessibility.AccessibleRole; @@ -54,7 +55,8 @@ import javax.accessibility.AccessibleRole; * * @author Aaron M. Renn (arenn@urbanophile.com) */ -public class Choice extends Component implements ItemSelectable, Serializable +public class Choice extends Component + implements ItemSelectable, Serializable, Accessible { /* @@ -83,23 +85,65 @@ private int selectedIndex = -1; // Listener chain private ItemListener item_listeners; +/** + * This class provides accessibility support for the + * combo box. + * + * @author Jerry Quinn (jlquinn@optonline.net) + * @author Andrew John Hughes (gnu_andrew@member.fsf.org) + */ protected class AccessibleAWTChoice - extends Component.AccessibleAWTComponent - implements AccessibleAction + extends AccessibleAWTComponent + implements AccessibleAction { + + /** + * Serialization constant to match JDK 1.5 + */ + private static final long serialVersionUID = 7175603582428509322L; + + /** + * Default constructor which simply calls the + * super class for generic component accessibility + * handling. + */ + public AccessibleAWTChoice() + { + super(); + } + + /** + * Returns an implementation of the <code>AccessibleAction</code> + * interface for this accessible object. In this case, the + * current instance is simply returned (with a more appropriate + * type), as it also implements the accessible action as well as + * the context. + * + * @return the accessible action associated with this context. + * @see javax.accessibility.AccessibleAction + */ public AccessibleAction getAccessibleAction() { return this; } - // FIXME: I think this is right, but should be checked by someone who - // knows better. + /** + * Returns the role of this accessible object. + * + * @return the instance of <code>AccessibleRole</code>, + * which describes this object. + * @see javax.accessibility.AccessibleRole + */ public AccessibleRole getAccessibleRole() { - return AccessibleRole.POPUP_MENU; + return AccessibleRole.COMBO_BOX; } - /* (non-Javadoc) + /** + * Returns the number of actions associated with this accessible + * object. In this case, it is the number of choices available. + * + * @return the number of choices available. * @see javax.accessibility.AccessibleAction#getAccessibleActionCount() */ public int getAccessibleActionCount() @@ -107,7 +151,14 @@ private ItemListener item_listeners; return pItems.size(); } - /* (non-Javadoc) + /** + * Returns a description of the action with the supplied id. + * In this case, it is the text used in displaying the particular + * choice on-screen. + * + * @param i the id of the choice whose description should be + * retrieved. + * @return the <code>String</code> used to describe the choice. * @see javax.accessibility.AccessibleAction#getAccessibleActionDescription(int) */ public String getAccessibleActionDescription(int i) @@ -115,7 +166,13 @@ private ItemListener item_listeners; return (String) pItems.get(i); } - /* (non-Javadoc) + /** + * Executes the action with the specified id. In this case, + * calling this method provides the same behaviour as would + * choosing a choice from the list in a visual manner. + * + * @param i the id of the choice to select. + * @return true if a valid choice was specified. * @see javax.accessibility.AccessibleAction#doAccessibleAction(int) */ public boolean doAccessibleAction(int i) @@ -564,8 +621,17 @@ paramString() return (ItemListener[]) getListeners (ItemListener.class); } + /** + * Gets the AccessibleContext associated with this <code>Choice</code>. + * The context is created, if necessary. + * + * @return the associated context + */ public AccessibleContext getAccessibleContext() { - return new AccessibleAWTChoice(); + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTChoice(); + return accessibleContext; } } // class Choice diff --git a/libjava/java/awt/Component.java b/libjava/java/awt/Component.java index cb47f77..3a7960c 100644 --- a/libjava/java/awt/Component.java +++ b/libjava/java/awt/Component.java @@ -1080,7 +1080,7 @@ public abstract class Component * * @return the locale for this component * @throws IllegalComponentStateException if it has no locale or parent - * @see setLocale(Locale) + * @see #setLocale(Locale) * @since 1.1 */ public Locale getLocale() @@ -1362,7 +1362,7 @@ public abstract class Component peer.setBounds (x, y, width, height); // Erase old bounds and repaint new bounds for lightweights. - if (isLightweight()) + if (isLightweight() && isShowing ()) { boolean shouldRepaintParent = false; boolean shouldRepaintSelf = false; @@ -1386,13 +1386,16 @@ public abstract class Component repaint(); } - if (oldx != x || oldy != y) + // Only post event if this component is visible and has changed size. + if (isShowing () + && (oldx != x || oldy != y)) { ComponentEvent ce = new ComponentEvent(this, ComponentEvent.COMPONENT_MOVED); getToolkit().getSystemEventQueue().postEvent(ce); } - if (oldwidth != width || oldheight != height) + if (isShowing () + && (oldwidth != width || oldheight != height)) { ComponentEvent ce = new ComponentEvent(this, ComponentEvent.COMPONENT_RESIZED); @@ -1955,7 +1958,7 @@ public abstract class Component * @see Graphics#drawImage(Image, int, int, ImageObserver) * @see Graphics#drawImage(Image, int, int, int, int, Color, ImageObserver) * @see Graphics#drawImage(Image, int, int, int, int, ImageObserver) - * @see ImageObserver#update(Image, int, int, int, int, int) + * @see ImageObserver#imageUpdate(Image, int, int, int, int, int) */ public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h) { @@ -2097,7 +2100,7 @@ public abstract class Component * @param observer the observer to notify of image loading progress * @return the image observer flags indicating the status of the load * @see #prepareImage(Image, int, int, ImageObserver) - * @see #Toolkit#checkImage(Image, int, int, ImageObserver) + * @see Toolkit#checkImage(Image, int, int, ImageObserver) * @throws NullPointerException if image is null */ public int checkImage(Image image, ImageObserver observer) @@ -2115,7 +2118,7 @@ public abstract class Component * @param observer the observer to notify of image loading progress * @return the image observer flags indicating the status of the load * @see #prepareImage(Image, int, int, ImageObserver) - * @see #Toolkit#checkImage(Image, int, int, ImageObserver) + * @see Toolkit#checkImage(Image, int, int, ImageObserver) */ public int checkImage(Image image, int width, int height, ImageObserver observer) @@ -2134,7 +2137,7 @@ public abstract class Component * @param ignoreRepaint the new setting for ignoring repaint events * @see #getIgnoreRepaint() * @see BufferStrategy - * @see GraphicsDevice.setFullScreenWindow(Window) + * @see GraphicsDevice#setFullScreenWindow(Window) * @since 1.4 */ public void setIgnoreRepaint(boolean ignoreRepaint) @@ -2250,9 +2253,9 @@ public abstract class Component * calls {@link #postEvent}. * * @param e the event to deliver - * @deprecated use {@link #dispatchEvent(AWTEvent)} instead + * @deprecated use {@link #dispatchEvent (AWTEvent)} instead */ - public void deliverEvent(Event e) + public void deliverEvent (Event e) { postEvent (e); } @@ -2284,7 +2287,7 @@ public abstract class Component * @return true if the event was handled, false otherwise * @deprecated use {@link #dispatchEvent(AWTEvent)} instead */ - public boolean postEvent(Event e) + public boolean postEvent (Event e) { boolean handled = handleEvent (e); @@ -3178,8 +3181,8 @@ public abstract class Component * AWT 1.0 event handler. * * This method calls one of the event-specific handler methods. For - * example for key events, either {@link #keyDown (Event evt, int - * key)} or {@link keyUp (Event evt, int key)} is called. A derived + * example for key events, either {@link #keyDown(Event,int)} + * or {@link #keyUp(Event,int)} is called. A derived * component can override one of these event-specific methods if it * only needs to handle certain event types. Otherwise it can * override handleEvent itself and handle any event. @@ -3188,7 +3191,7 @@ public abstract class Component * @return true if the event was handled, false otherwise * @deprecated use {@link #processEvent(AWTEvent)} instead */ - public boolean handleEvent(Event evt) + public boolean handleEvent (Event evt) { switch (evt.id) { @@ -3405,9 +3408,15 @@ public abstract class Component */ public void removeNotify() { - if (peer != null) - peer.dispose(); + // We null our peer field before disposing of it, such that if we're + // not the event dispatch thread and the dispatch thread is awoken by + // the dispose call, there will be no race checking the peer's null + // status. + + ComponentPeer tmp = peer; peer = null; + if (tmp != null) + tmp.dispose(); } /** @@ -3469,8 +3478,8 @@ public abstract class Component * Specify whether this component can receive focus. This method also * sets the {@link #isFocusTraversableOverridden} field to 1, which * appears to be the undocumented way {@link - * DefaultFocusTraversalPolicy#accept()} determines whether to respect - * the {@link #isFocusable()} method of the component. + * DefaultFocusTraversalPolicy#accept(Component)} determines whether to + * respect the {@link #isFocusable()} method of the component. * * @param focusable the new focusable status * @since 1.4 @@ -3484,10 +3493,10 @@ public abstract class Component /** * Sets the focus traversal keys for one of the three focus - * traversal directions supported by Components: {@link - * #KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS}, {@link - * #KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS}, or {@link - * #KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS}. Normally, the + * traversal directions supported by Components: + * {@link #KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS}, + * {@link #KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS}, or + * {@link #KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS}. Normally, the * default values should match the operating system's native * choices. To disable a given traversal, use * <code>Collections.EMPTY_SET</code>. The event dispatcher will @@ -3716,7 +3725,7 @@ public abstract class Component * receives a FOCUS_GAINED event. * * The behaviour of this method is platform-dependent. - * {@link #requestFocusInWindow} should be used instead. + * {@link #requestFocusInWindow()} should be used instead. * * @see #requestFocusInWindow () * @see FocusEvent @@ -3791,7 +3800,7 @@ public abstract class Component * receives a FOCUS_GAINED event. * * The behaviour of this method is platform-dependent. - * {@link #requestFocusInWindow} should be used instead. + * {@link #requestFocusInWindow()} should be used instead. * * If the return value is false, the request is guaranteed to fail. * If the return value is true, the request will succeed unless it @@ -3855,10 +3864,10 @@ public abstract class Component currentFocusOwner)); } else - eq.postEvent (new FocusEvent(this, FocusEvent.FOCUS_GAINED, temporary)); + eq.postEvent (new FocusEvent(this, FocusEvent.FOCUS_GAINED, temporary)); + } } } - } else // FIXME: need to add a focus listener to our top-level // ancestor, so that we can post this event when it becomes @@ -3973,10 +3982,10 @@ public abstract class Component currentFocusOwner)); } else - eq.postEvent (new FocusEvent(this, FocusEvent.FOCUS_GAINED, temporary)); + eq.postEvent (new FocusEvent(this, FocusEvent.FOCUS_GAINED, temporary)); + } } } - } else return false; } @@ -4069,8 +4078,8 @@ public abstract class Component * However, if this is a Window, the default focus owner in the * window in the current focus cycle is focused instead. * - * @see #requestFocus () - * @see #isFocusCycleRoot () + * @see #requestFocus() + * @see #isFocusCycleRoot(Container) * @since 1.4 */ public void transferFocusUpCycle () diff --git a/libjava/java/awt/Container.java b/libjava/java/awt/Container.java index 6c835d2..6c5dec2 100644 --- a/libjava/java/awt/Container.java +++ b/libjava/java/awt/Container.java @@ -1,5 +1,5 @@ /* Container.java -- parent container class in AWT - Copyright (C) 1999, 2000, 2002, 2003, 2004 Free Software Foundation + Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005 Free Software Foundation This file is part of GNU Classpath. @@ -387,11 +387,14 @@ public class Container extends Component layoutMgr.addLayoutComponent(null, comp); } - // Post event to notify of adding the container. - ContainerEvent ce = new ContainerEvent(this, - ContainerEvent.COMPONENT_ADDED, - comp); - getToolkit().getSystemEventQueue().postEvent(ce); + if (isShowing ()) + { + // Post event to notify of adding the component. + ContainerEvent ce = new ContainerEvent(this, + ContainerEvent.COMPONENT_ADDED, + comp); + getToolkit().getSystemEventQueue().postEvent(ce); + } } } @@ -419,11 +422,14 @@ public class Container extends Component r.parent = null; - // Post event to notify of adding the container. - ContainerEvent ce = new ContainerEvent(this, - ContainerEvent.COMPONENT_REMOVED, - r); - getToolkit().getSystemEventQueue().postEvent(ce); + if (isShowing ()) + { + // Post event to notify of removing the component. + ContainerEvent ce = new ContainerEvent(this, + ContainerEvent.COMPONENT_REMOVED, + r); + getToolkit().getSystemEventQueue().postEvent(ce); + } } } @@ -1046,11 +1052,14 @@ public class Container extends Component */ protected String paramString() { - String param = super.paramString(); - if (layoutMgr != null) - param = param + ",layout=" + layoutMgr.getClass().getName(); + if (layoutMgr == null) + return super.paramString(); - return param; + StringBuffer sb = new StringBuffer(); + sb.append(super.paramString()); + sb.append(",layout="); + sb.append(layoutMgr.getClass().getName()); + return sb.toString(); } /** diff --git a/libjava/java/awt/DefaultKeyboardFocusManager.java b/libjava/java/awt/DefaultKeyboardFocusManager.java index 800b01d..9c94d8a 100644 --- a/libjava/java/awt/DefaultKeyboardFocusManager.java +++ b/libjava/java/awt/DefaultKeyboardFocusManager.java @@ -226,7 +226,7 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager Component focusOwner = getGlobalPermanentFocusOwner (); if (focusOwner != null) - processKeyEvent (focusOwner, (KeyEvent) e); + processKeyEvent (focusOwner, (KeyEvent) e); if (e.isConsumed ()) return true; diff --git a/libjava/java/awt/Dialog.java b/libjava/java/awt/Dialog.java index 6bfb80c8..30631b3 100644 --- a/libjava/java/awt/Dialog.java +++ b/libjava/java/awt/Dialog.java @@ -40,6 +40,11 @@ package java.awt; import java.awt.peer.DialogPeer; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; + /** * A dialog box widget class. * @@ -511,5 +516,38 @@ paramString() this.undecorated = undecorated; } + + protected class AccessibleAWTDialog extends AccessibleAWTWindow + { + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.DIALOG; + } + + public AccessibleStateSet getAccessibleState() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + if (isResizable()) + states.add(AccessibleState.RESIZABLE); + if (isModal()) + states.add(AccessibleState.MODAL); + return states; + } + } + + /** + * Gets the AccessibleContext associated with this <code>Dialog</code>. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTDialog(); + return accessibleContext; + } + } // class Dialog diff --git a/libjava/java/awt/EventDispatchThread.java b/libjava/java/awt/EventDispatchThread.java index 0803ff6..d55f0f5 100644 --- a/libjava/java/awt/EventDispatchThread.java +++ b/libjava/java/awt/EventDispatchThread.java @@ -53,7 +53,6 @@ class EventDispatchThread extends Thread setName("AWT-EventQueue-" + ++dispatchThreadNum); this.queue = queue; setPriority(NORM_PRIORITY + 1); - start(); } public void run() @@ -63,11 +62,6 @@ class EventDispatchThread extends Thread try { AWTEvent evt = queue.getNextEvent(); - if (isInterrupted ()) - { - // We are interrupted when we should finish executing - return; - } KeyboardFocusManager manager; manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); @@ -80,6 +74,11 @@ class EventDispatchThread extends Thread if (!manager.dispatchEvent (evt)) queue.dispatchEvent(evt); } + catch (ThreadDeath death) + { + // If someone wants to kill us, let them. + return; + } catch (InterruptedException ie) { // We are interrupted when we should finish executing diff --git a/libjava/java/awt/EventQueue.java b/libjava/java/awt/EventQueue.java index fd1c806..fc0926c 100644 --- a/libjava/java/awt/EventQueue.java +++ b/libjava/java/awt/EventQueue.java @@ -40,9 +40,12 @@ package java.awt; import java.awt.event.ActionEvent; import java.awt.event.InputEvent; import java.awt.event.InvocationEvent; +import java.awt.event.WindowEvent; import java.lang.reflect.InvocationTargetException; import java.util.EmptyStackException; +import gnu.java.awt.ClasspathToolkit; + /* Written using on-line Java 2 Platform Standard Edition v1.3 API * Specification, as well as "The Java Class Libraries", 2nd edition * (Addison-Wesley, 1998). @@ -71,6 +74,35 @@ public class EventQueue private long lastWhen = System.currentTimeMillis(); private EventDispatchThread dispatchThread = new EventDispatchThread(this); + private boolean shutdown = false; + + private long lastNativeQueueAccess = 0; + private long humanLatencyThreshold = 100; + + synchronized void setShutdown (boolean b) + { + shutdown = b; + } + + synchronized boolean isShutdown () + { + if (shutdown) + return true; + + // This is the exact self-shutdown condition specified in J2SE: + // http://java.sun.com/j2se/1.4.2/docs/api/java/awt/doc-files/AWTThreadIssues.html + + if (peekEvent() == null + && ((ClasspathToolkit) Toolkit.getDefaultToolkit()).nativeQueueEmpty()) + { + Frame[] frames = Frame.getFrames(); + for (int i = 0; i < frames.length; ++i) + if (frames[i].isDisplayable()) + return false; + return true; + } + return false; + } /** * Initializes a new instance of <code>EventQueue</code>. @@ -93,9 +125,51 @@ public class EventQueue { if (next != null) return next.getNextEvent(); + + ClasspathToolkit tk = ((ClasspathToolkit) Toolkit.getDefaultToolkit()); + long curr = System.currentTimeMillis(); + + if (! tk.nativeQueueEmpty() && + (curr - lastNativeQueueAccess > humanLatencyThreshold)) + { + tk.iterateNativeQueue(this, false); + lastNativeQueueAccess = curr; + } while (next_in == next_out) - wait(); + { + // Only the EventDispatchThread associated with the top of the stack is + // allowed to get events from the native source; everyone else just + // waits on the head of the queue. + + if (isDispatchThread()) + { + // We are not allowed to return null from this method, yet it + // is possible that we actually have run out of native events + // in the enclosing while() loop, and none of the native events + // happened to cause AWT events. We therefore ought to check + // the isShutdown() condition here, before risking a "native + // wait". If we check it before entering this function we may + // wait forever for events after the shutdown condition has + // arisen. + + if (isShutdown()) + throw new InterruptedException(); + + tk.iterateNativeQueue(this, true); + lastNativeQueueAccess = System.currentTimeMillis(); + } + else + { + try + { + wait(); + } + catch (InterruptedException ie) + { + } + } + } AWTEvent res = queue[next_out]; @@ -215,6 +289,22 @@ public class EventQueue next_out = 0; next_in = oldQueue.length; } + + if (dispatchThread == null || !dispatchThread.isAlive()) + { + dispatchThread = new EventDispatchThread(this); + dispatchThread.start(); + } + + // Window events might represent the closing of a window, which + // might cause the end of the dispatch thread's life, so we'll wake + // it up here to give it a chance to check for shutdown. + + if (!isDispatchThread() + || (evt.getID() == WindowEvent.WINDOW_CLOSED) + || (evt.getID() == WindowEvent.WINDOW_CLOSING)) + ((ClasspathToolkit) Toolkit.getDefaultToolkit()).wakeNativeQueue(); + notify(); } @@ -386,9 +476,10 @@ public class EventQueue next_in = 0; next_out = 0; - // Tell our EventDispatchThread that it can end execution - dispatchThread.interrupt (); + ((ClasspathToolkit) Toolkit.getDefaultToolkit()).wakeNativeQueue(); + setShutdown(true); dispatchThread = null; + this.notifyAll(); } } } diff --git a/libjava/java/awt/Frame.java b/libjava/java/awt/Frame.java index 80d2c99..465a268 100644 --- a/libjava/java/awt/Frame.java +++ b/libjava/java/awt/Frame.java @@ -39,8 +39,16 @@ exception statement from your version. */ package java.awt; import java.awt.peer.FramePeer; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Iterator; import java.util.Vector; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; + /** * This class is a top-level window with a title bar and window * decorations. @@ -196,7 +204,7 @@ private String title = ""; */ private boolean undecorated = false; -/* + /* * The number used to generate the name returned by getName. */ private static transient long next_frame_number; @@ -209,6 +217,7 @@ public Frame() { this(""); + noteFrame(this); } /** @@ -224,6 +233,7 @@ Frame(String title) this.title = title; // Top-level frames are initially invisible. visible = false; + noteFrame(this); } public @@ -231,6 +241,7 @@ Frame(GraphicsConfiguration gc) { super(gc); visible = false; + noteFrame(this); } public @@ -239,6 +250,7 @@ Frame(String title, GraphicsConfiguration gc) super(gc); setTitle(title); visible = false; + noteFrame(this); } /** @@ -391,6 +403,12 @@ remove(MenuComponent menu) /** * Notifies this frame that it should create its native peer. */ + +private static void fireDummyEvent() +{ + EventQueue.invokeLater(new Runnable() { public void run() { } }); +} + public void addNotify() { @@ -398,6 +416,12 @@ addNotify() menuBar.addNotify(); if (peer == null) peer = getToolkit ().createFrame (this); + + // We now know there's a Frame (us) with a live peer, so we can start the + // fundamental queue and dispatch thread, by inserting a dummy event. + if (parent != null && parent.isDisplayable()) + fireDummyEvent(); + super.addNotify(); } @@ -406,15 +430,21 @@ public void removeNotify() if (menuBar != null) menuBar.removeNotify(); super.removeNotify(); + + // By now we've been disconnected from the peer, and the peer set to + // null. This is formally the same as saying "we just became + // un-displayable", so we wake up the event queue with a dummy event to + // see if it's time to shut down. + fireDummyEvent(); } -/** - * Returns a debugging string describing this window. - * - * @return A debugging string describing this window. - */ + /** + * Returns a debugging string describing this window. + * + * @return A debugging string describing this window. + */ protected String paramString () -{ + { String title = getTitle (); String resizable = ""; @@ -442,15 +472,43 @@ public void removeNotify() } return super.paramString () + ",title=" + title + resizable + state; + } + +private static ArrayList weakFrames = new ArrayList(); + +private static void noteFrame(Frame f) +{ + weakFrames.add(new WeakReference(f)); } -public static Frame[] -getFrames() +public static Frame[] getFrames() { - //Frame[] array = new Frames[frames.size()]; - //return frames.toArray(array); - String msg = "FIXME: can't be implemented without weak references"; - throw new UnsupportedOperationException(msg); + int n = 0; + synchronized (weakFrames) + { + Iterator i = weakFrames.iterator(); + while (i.hasNext()) + { + WeakReference wr = (WeakReference) i.next(); + if (wr.get() != null) + ++n; + } + if (n == 0) + return new Frame[0]; + else + { + Frame[] frames = new Frame[n]; + n = 0; + i = weakFrames.iterator(); + while (i.hasNext()) + { + WeakReference wr = (WeakReference) i.next(); + if (wr.get() != null) + frames[n++] = (Frame) wr.get(); + } + return frames; + } + } } public void setState (int state) @@ -549,4 +607,37 @@ getFrames() { return next_frame_number++; } + + protected class AccessibleAWTFrame extends AccessibleAWTWindow + { + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.FRAME; + } + + public AccessibleStateSet getAccessibleState() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + if (isResizable()) + states.add(AccessibleState.RESIZABLE); + if ((state & ICONIFIED) != 0) + states.add(AccessibleState.ICONIFIED); + return states; + } + } + + /** + * Gets the AccessibleContext associated with this <code>Frame</code>. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTFrame(); + return accessibleContext; + } + } diff --git a/libjava/java/awt/Label.java b/libjava/java/awt/Label.java index 189bc10..0206cec 100644 --- a/libjava/java/awt/Label.java +++ b/libjava/java/awt/Label.java @@ -306,10 +306,7 @@ public AccessibleContext getAccessibleContext() { /* Create the context if this is the first request */ if (accessibleContext == null) - { - /* Create the context */ - accessibleContext = new AccessibleAWTLabel(); - } + accessibleContext = new AccessibleAWTLabel(); return accessibleContext; } diff --git a/libjava/java/awt/List.java b/libjava/java/awt/List.java index 8fbbc07..e10cbae 100644 --- a/libjava/java/awt/List.java +++ b/libjava/java/awt/List.java @@ -47,6 +47,11 @@ import java.util.EventListener; import java.util.Vector; import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleSelection; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; /** * Class that implements a listbox widget @@ -106,6 +111,7 @@ private ItemListener item_listeners; // The list of ActionListeners for this object. private ActionListener action_listeners; + /*************************************************************************/ /* @@ -1076,4 +1082,182 @@ paramString() { return (ItemListener[]) getListeners (ItemListener.class); } + + // Accessibility internal class + protected class AccessibleAWTList extends AccessibleAWTComponent + implements AccessibleSelection, ItemListener, ActionListener + { + protected class AccessibleAWTListChild extends AccessibleAWTComponent + implements Accessible + { + private int index; + private List parent; + + public AccessibleAWTListChild(List parent, int indexInParent) + { + this.parent = parent; + index = indexInParent; + if (parent == null) + index = -1; + } + + /* (non-Javadoc) + * @see javax.accessibility.Accessible#getAccessibleContext() + */ + public AccessibleContext getAccessibleContext() + { + return this; + } + + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.LIST_ITEM; + } + + public AccessibleStateSet getAccessibleStateSet() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + if (parent.isIndexSelected(index)) + states.add(AccessibleState.SELECTED); + return states; + } + + public int getAccessibleIndexInParent() + { + return index; + } + + } + + public AccessibleAWTList() + { + addItemListener(this); + addActionListener(this); + } + + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.LIST; + } + + public AccessibleStateSet getAccessibleStateSet() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + states.add(AccessibleState.SELECTABLE); + if (isMultipleMode()) + states.add(AccessibleState.MULTISELECTABLE); + return states; + } + + public int getAccessibleChildrenCount() + { + return getItemCount(); + } + + public Accessible getAccessibleChild(int i) + { + if (i >= getItemCount()) + return null; + return new AccessibleAWTListChild(List.this, i); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#getAccessibleSelectionCount() + */ + public int getAccessibleSelectionCount() + { + return getSelectedIndexes().length; + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#getAccessibleSelection() + */ + public AccessibleSelection getAccessibleSelection() + { + return this; + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#getAccessibleSelection(int) + */ + public Accessible getAccessibleSelection(int i) + { + int[] items = getSelectedIndexes(); + if (i >= items.length) + return null; + return new AccessibleAWTListChild(List.this, items[i]); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#isAccessibleChildSelected(int) + */ + public boolean isAccessibleChildSelected(int i) + { + return isIndexSelected(i); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#addAccessibleSelection(int) + */ + public void addAccessibleSelection(int i) + { + select(i); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#removeAccessibleSelection(int) + */ + public void removeAccessibleSelection(int i) + { + deselect(i); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#clearAccessibleSelection() + */ + public void clearAccessibleSelection() + { + for (int i = 0; i < getItemCount(); i++) + deselect(i); + } + + /* (non-Javadoc) + * @see javax.accessibility.AccessibleSelection#selectAllAccessibleSelection() + */ + public void selectAllAccessibleSelection() + { + if (isMultipleMode()) + for (int i = 0; i < getItemCount(); i++) + select(i); + } + + /* (non-Javadoc) + * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent) + */ + public void itemStateChanged(ItemEvent event) + { + } + + /* (non-Javadoc) + * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) + */ + public void actionPerformed(ActionEvent event) + { + } + + } + + /** + * Gets the AccessibleContext associated with this <code>List</code>. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTList(); + return accessibleContext; + } } // class List diff --git a/libjava/java/awt/Menu.java b/libjava/java/awt/Menu.java index 35798a06..3cc9cc3 100644 --- a/libjava/java/awt/Menu.java +++ b/libjava/java/awt/Menu.java @@ -451,12 +451,18 @@ paramString() } } - /* (non-Javadoc) - * @see java.awt.MenuComponent#getAccessibleContext() + /** + * Gets the AccessibleContext associated with this <code>Menu</code>. + * The context is created, if necessary. + * + * @return the associated context */ public AccessibleContext getAccessibleContext() { - return new AccessibleAWTMenu(); + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTMenu(); + return accessibleContext; } } // class Menu diff --git a/libjava/java/awt/MenuBar.java b/libjava/java/awt/MenuBar.java index 6a97fa9..c040235 100644 --- a/libjava/java/awt/MenuBar.java +++ b/libjava/java/awt/MenuBar.java @@ -381,10 +381,7 @@ public AccessibleContext getAccessibleContext() { /* Create the context if this is the first request */ if (accessibleContext == null) - { - /* Create the context */ - accessibleContext = new AccessibleAWTMenuBar(); - } + accessibleContext = new AccessibleAWTMenuBar(); return accessibleContext; } diff --git a/libjava/java/awt/MenuComponent.java b/libjava/java/awt/MenuComponent.java index 78adfae..db6d4bd 100644 --- a/libjava/java/awt/MenuComponent.java +++ b/libjava/java/awt/MenuComponent.java @@ -130,7 +130,7 @@ private static final long serialVersionUID = -4536902356223894379L; * @see #getAccessibleContext() * @serial the accessibility information for this component. */ - private AccessibleContext accessibleContext; + AccessibleContext accessibleContext; /** * Was the name of the component set? This value defaults diff --git a/libjava/java/awt/MenuItem.java b/libjava/java/awt/MenuItem.java index a587742..56082d3 100644 --- a/libjava/java/awt/MenuItem.java +++ b/libjava/java/awt/MenuItem.java @@ -47,6 +47,7 @@ import java.util.EventListener; import javax.accessibility.Accessible; import javax.accessibility.AccessibleAction; +import javax.accessibility.AccessibleContext; import javax.accessibility.AccessibleRole; import javax.accessibility.AccessibleValue; @@ -562,7 +563,10 @@ protected void processActionEvent(ActionEvent event) { if (action_listeners != null) - action_listeners.actionPerformed(event); + { + event.setSource(this); + action_listeners.actionPerformed(event); + } } /*************************************************************************/ @@ -579,7 +583,18 @@ paramString() ",actionCommand=" + actionCommand + "," + super.paramString()); } -// Accessibility API not yet implemented. -// public AccessibleContext getAccessibleContext() +/** + * Gets the AccessibleContext associated with this <code>MenuItem</code>. + * The context is created, if necessary. + * + * @return the associated context + */ +public AccessibleContext getAccessibleContext() +{ + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTMenuItem(); + return accessibleContext; +} } // class MenuItem diff --git a/libjava/java/awt/PopupMenu.java b/libjava/java/awt/PopupMenu.java index 7508202..92840df 100644 --- a/libjava/java/awt/PopupMenu.java +++ b/libjava/java/awt/PopupMenu.java @@ -151,9 +151,18 @@ show(Component component, int x, int y) } + /** + * Gets the AccessibleContext associated with this <code>PopupMenu</code>. + * The context is created, if necessary. + * + * @return the associated context + */ public AccessibleContext getAccessibleContext() { - return new AccessibleAWTPopupMenu(); + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTPopupMenu(); + return accessibleContext; } } // class PopupMenu diff --git a/libjava/java/awt/Robot.java b/libjava/java/awt/Robot.java index f633fc0..49726c8 100644 --- a/libjava/java/awt/Robot.java +++ b/libjava/java/awt/Robot.java @@ -1,5 +1,5 @@ -/* Robot.java -- - Copyright (C) 2002 Free Software Foundation, Inc. +/* Robot.java -- a native input event generator + Copyright (C) 2004, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,112 +38,384 @@ exception statement from your version. */ package java.awt; +import gnu.java.awt.ClasspathToolkit; + +import java.awt.event.InputEvent; import java.awt.image.BufferedImage; +import java.awt.peer.RobotPeer; /** + * The Robot class is used to simulate user interaction with graphical + * programs. It can generate native windowing system input events and + * retrieve image data from the current screen. Robot is used to test + * the AWT and Swing library implementations; it can also be used to + * create self-running demo programs. + * + * Since Robot generates native windowing system events, rather than + * simply inserting {@link AWTEvents} on the AWT event queue, its use + * is not restricted to Java programs. It can be to programatically + * drive any graphical application. + * + * This implementation requires an X server that supports the XTest + * extension. + * + * @author Thomas Fitzsimmons (fitzsim@redhat.com) + * * @since 1.3 */ -/** STUB CLASS ONLY */ public class Robot { - private GraphicsDevice screen; private boolean waitForIdle; private int autoDelay; - + private RobotPeer peer; + /** - * Creates a <code>Robot</code> object. - * - * @exception AWTException If GraphicsEnvironment.isHeadless() returns true. - * @exception SecurityException If createRobot permission is not granted. + * Construct a Robot object that operates on the default screen. + * + * @exception AWTException if GraphicsEnvironment.isHeadless() + * returns true or if the X server does not support the XTest + * extension + * @exception SecurityException if createRobot permission is not + * granted */ - public Robot() throws AWTException + public Robot () throws AWTException { - throw new Error("not implemented"); + if (GraphicsEnvironment.isHeadless ()) + throw new AWTException ("Robot: headless graphics environment"); + + SecurityManager sm = System.getSecurityManager (); + if (sm != null) + sm.checkPermission (new AWTPermission ("createRobot")); + + ClasspathToolkit tk = (ClasspathToolkit) Toolkit.getDefaultToolkit (); + + // createRobot will throw AWTException if XTest is not supported. + peer = tk.createRobot (GraphicsEnvironment.getLocalGraphicsEnvironment () + .getDefaultScreenDevice ()); } /** - * Creates a <code>Robot</code> object. - * - * @exception AWTException If GraphicsEnvironment.isHeadless() returns true. - * @exception IllegalArgumentException If <code>screen</code> is not a screen - * GraphicsDevice. - * @exception SecurityException If createRobot permission is not granted. + * Construct a Robot object that operates on the specified screen. + * + * @exception AWTException if GraphicsEnvironment.isHeadless() + * returns true or if the X server does not support the XTest + * extension + * @exception IllegalArgumentException if screen is not a screen + * GraphicsDevice + * @exception SecurityException if createRobot permission is not + * granted */ - public Robot(GraphicsDevice screen) throws AWTException + public Robot (GraphicsDevice screen) throws AWTException { - this(); - this.screen = screen; + if (GraphicsEnvironment.isHeadless ()) + throw new AWTException ("Robot: headless graphics environment"); + + if (screen.getType () != GraphicsDevice.TYPE_RASTER_SCREEN) + throw new IllegalArgumentException ("Robot: graphics" + + " device is not a screen"); + + SecurityManager sm = System.getSecurityManager (); + if (sm != null) + sm.checkPermission (new AWTPermission ("createRobot")); + + ClasspathToolkit tk = (ClasspathToolkit) Toolkit.getDefaultToolkit (); + + // createRobot will throw AWTException if XTest is not supported. + peer = tk.createRobot (screen); } + /** + * Move the mouse pointer to absolute coordinates (x, y). + * + * @param x the destination x coordinate + * @param y the destination y coordinate + */ public void mouseMove(int x, int y) { + peer.mouseMove (x, y); + + if (waitForIdle) + waitForIdle (); + + if (autoDelay > 0) + delay (autoDelay); } - public void mousePress(int buttons) + /** + * Press one or more mouse buttons. + * + * @param buttons the buttons to press; a bitmask of one or more of + * these {@link InputEvent} fields: + * + * <ul> + * <li>BUTTON1_MASK</li> + * <li>BUTTON2_MASK</li> + * <li>BUTTON3_MASK</li> + * </ul> + * + * @exception IllegalArgumentException if the button mask is invalid + */ + public void mousePress (int buttons) { + if ((buttons & InputEvent.BUTTON1_MASK) == 0 + && (buttons & InputEvent.BUTTON2_MASK) == 0 + && (buttons & InputEvent.BUTTON3_MASK) == 0) + throw new IllegalArgumentException ("Robot: mousePress:" + + " invalid button mask"); + + peer.mousePress (buttons); + + if (waitForIdle) + waitForIdle (); + + if (autoDelay > 0) + delay (autoDelay); } + /** + * Release one or more mouse buttons. + * + * @param buttons the buttons to release; a bitmask of one or more + * of these {@link InputEvent} fields: + * + * <ul> + * <li>BUTTON1_MASK</li> + * <li>BUTTON2_MASK</li> + * <li>BUTTON3_MASK</li> + * </ul> + * + * @exception IllegalArgumentException if the button mask is invalid + */ public void mouseRelease(int buttons) { + if ((buttons & InputEvent.BUTTON1_MASK) == 0 + && (buttons & InputEvent.BUTTON2_MASK) == 0 + && (buttons & InputEvent.BUTTON3_MASK) == 0) + throw new IllegalArgumentException ("Robot: mouseRelease:" + + " invalid button mask"); + + peer.mouseRelease (buttons); + + if (waitForIdle) + waitForIdle (); + + if (autoDelay > 0) + delay (autoDelay); } - public void mouseWheel(int wheelAmt) + /** + * Rotate the mouse scroll wheel. + * + * @param wheelAmt number of steps to rotate mouse wheel. negative + * to rotate wheel up (away from the user), positive to rotate wheel + * down (toward the user). + * + * @since 1.4 + */ + public void mouseWheel (int wheelAmt) { + peer.mouseWheel (wheelAmt); + + if (waitForIdle) + waitForIdle (); + + if (autoDelay > 0) + delay (autoDelay); } - public void keyPress(int keycode) + /** + * Press a key. + * + * @param keycode key to press, a {@link KeyEvent} VK_ constant + * + * @exception IllegalArgumentException if keycode is not a valid key + */ + public void keyPress (int keycode) { + peer.keyPress (keycode); + + if (waitForIdle) + waitForIdle (); + + if (autoDelay > 0) + delay (autoDelay); } - public void keyRelease(int keycode) + /** + * Release a key. + * + * @param keycode key to release, a {@link KeyEvent} VK_ constant + * + * @exception IllegalArgumentException if keycode is not a valid key + */ + public void keyRelease (int keycode) { + peer.keyRelease (keycode); + + if (waitForIdle) + waitForIdle (); + + if (autoDelay > 0) + delay (autoDelay); } - - public Color getPixelColor(int x, int y) + + /** + * Return the color of the pixel at the given screen coordinates. + * + * @param x the x coordinate of the pixel + * @param y the y coordinate of the pixel + * + * @return the Color of the pixel at screen coodinates <code>(x, y)</code> + */ + public Color getPixelColor (int x, int y) { - return null; + return new Color (peer.getRGBPixel (x, y)); } - public BufferedImage createScreenCapture(Rectangle screen) + /** + * Create an image containing pixels read from the screen. The + * image does not include the mouse pointer. + * + * @param screenRect the rectangle of pixels to capture, in screen + * coordinates + * + * @return a BufferedImage containing the requested pixels + * + * @exception IllegalArgumentException if requested width and height + * are not both greater than zero + * @exception SecurityException if readDisplayPixels permission is + * not granted + */ + public BufferedImage createScreenCapture (Rectangle screenRect) { - return null; + if (screenRect.width <= 0) + throw new IllegalArgumentException ("Robot: capture width is <= 0"); + + if (screenRect.height <= 0) + throw new IllegalArgumentException ("Robot: capture height is <= 0"); + + SecurityManager sm = System.getSecurityManager (); + if (sm != null) + sm.checkPermission (new AWTPermission ("readDisplayPixels")); + + int[] pixels = peer.getRGBPixels (screenRect); + + BufferedImage bufferedImage = + new BufferedImage (screenRect.width, screenRect.height, + BufferedImage.TYPE_INT_ARGB); + + bufferedImage.setRGB (0, 0, screenRect.width, screenRect.height, + pixels, 0, screenRect.width); + + return bufferedImage; } - - public boolean isAutoWaitForIdle() + + /** + * Check if this Robot automatically calls {@link waitForIdle} after + * generating an event. + * + * @return true if waitForIdle is automatically called + */ + public boolean isAutoWaitForIdle () { return waitForIdle; } - - public void setAutoWaitForIdle(boolean value) + + /** + * Set whether or not this Robot automatically calls {@link + * waitForIdle} after generating an event. + * + * @param isOn true if waitForIdle should be called automatically + */ + public void setAutoWaitForIdle (boolean isOn) { - waitForIdle = value; + waitForIdle = isOn; } - - public int getAutoDelay() + + /** + * Retrieve the length of time this Robot sleeps after generating an + * event. + * + * @return the length of time in milliseconds + */ + public int getAutoDelay () { return autoDelay; } - - public void setAutoDelay(int ms) + + /** + * Set the length of time this Robot sleeps after generating an + * event. + * + * @param ms the length of time in milliseconds + * + * @exception IllegalArgumentException if ms is not between 0 and + * 60,000 milliseconds inclusive + */ + public void setAutoDelay (int ms) { - if (ms < 0 || ms > 60000) - throw new IllegalArgumentException(); - + if (ms <= 0 || ms >= 60000) + throw new IllegalArgumentException ("Robot: delay length out-of-bounds"); + autoDelay = ms; } - public void delay(int ms) + /** + * Sleep for a specified length of time. + * + * @param ms the length of time in milliseconds + * + * @exception IllegalArgumentException if ms is not between 0 and + * 60,000 milliseconds inclusive + */ + public void delay (int ms) { if (ms < 0 || ms > 60000) - throw new IllegalArgumentException(); + throw new IllegalArgumentException ("Robot: delay length out-of-bounds"); + + try + { + Thread.sleep (ms); + } + catch (InterruptedException e) + { + System.err.println ("Robot: delay interrupted"); + } } - public void waitForIdle() + /** + * Wait until the event dispatch thread is idle. + */ + public void waitForIdle () { + if (EventQueue.isDispatchThread ()) + throw new IllegalThreadStateException ("Robot: waitForIdle called from " + + "the event dispatch thread"); + + EventQueue q = Toolkit.getDefaultToolkit ().getSystemEventQueue (); + + while (q.peekEvent () != null) + { + try + { + wait (); + } + catch (InterruptedException e) + { + System.err.println ("Robot: waitForIdle interrupted"); + } + } } - public String toString() + /** + * Return a string representation of this Robot. + * + * @return a string representation + */ + public String toString () { - return "unimplemented"; + return getClass ().getName () + + "[ autoDelay = " + autoDelay + ", autoWaitForIdle = " + + waitForIdle + " ]"; } -} // class Robot +} diff --git a/libjava/java/awt/ScrollPane.java b/libjava/java/awt/ScrollPane.java index abd5514..c38feb3 100644 --- a/libjava/java/awt/ScrollPane.java +++ b/libjava/java/awt/ScrollPane.java @@ -43,6 +43,8 @@ import java.awt.peer.ComponentPeer; import java.awt.peer.ScrollPanePeer; import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; /** * This widget provides a scrollable region that allows a single @@ -587,5 +589,27 @@ paramString() { wheelScrollingEnabled = enable; } + + protected class AccessibleAWTScrollPane extends AccessibleAWTContainer + { + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.SCROLL_PANE; + } + } + + /** + * Gets the AccessibleContext associated with this <code>ScrollPane</code>. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTScrollPane(); + return accessibleContext; + } } // class ScrollPane diff --git a/libjava/java/awt/Scrollbar.java b/libjava/java/awt/Scrollbar.java index 7cc9715..9141ea5 100644 --- a/libjava/java/awt/Scrollbar.java +++ b/libjava/java/awt/Scrollbar.java @@ -1,5 +1,5 @@ /* Scrollbar.java -- AWT Scrollbar widget - Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 + Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -45,694 +45,603 @@ import java.awt.peer.ScrollbarPeer; import java.util.EventListener; import javax.accessibility.Accessible; - -/** - * This class implements a scrollbar widget. - * - * @author Aaron M. Renn (arenn@urbanophile.com) - * @author Tom Tromey <tromey@cygnus.com> - */ -public class Scrollbar extends Component implements Accessible, - Adjustable -{ - -// FIXME: Serialization readObject/writeObject - -/* - * Static Variables +import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; +import javax.accessibility.AccessibleValue; + +/** + * This class implements a scrollbar widget. + * + * @author Aaron M. Renn (arenn@urbanophile.com) + * @author Tom Tromey (tromey@cygnus.com) + * @author Andrew John Hughes (gnu_andrew@member.fsf.org) */ +public class Scrollbar extends Component implements Accessible, Adjustable +{ + // FIXME: Serialization readObject/writeObject -/** - * Constant indicating that a scrollbar is horizontal. - */ -public static final int HORIZONTAL = 0; - -/** - * Constant indicating that a scrollbar is vertical. - */ -public static final int VERTICAL = 1; + /** + * Constant indicating that a scrollbar is horizontal. + */ + public static final int HORIZONTAL = 0; -// Serialization Constant -private static final long serialVersionUID = 8451667562882310543L; + /** + * Constant indicating that a scrollbar is vertical. + */ + public static final int VERTICAL = 1; -/*************************************************************************/ + /** + * Serialization Constant. + */ + private static final long serialVersionUID = 8451667562882310543L; -/** - * @serial The amount by which the value of the scrollbar is changed - * when incrementing in line mode. - */ -private int lineIncrement; + /** + * @serial The amount by which the value of the scrollbar is changed + * when incrementing in line mode. + */ + private int lineIncrement; -/** - * @serial The amount by which the value of the scrollbar is changed - * when incrementing in page mode. - */ -private int pageIncrement; + /** + * @serial The amount by which the value of the scrollbar is changed + * when incrementing in page mode. + */ + private int pageIncrement; -/** - * @serial The maximum value for this scrollbar - */ -private int maximum; + /** + * @serial The maximum value for this scrollbar + */ + private int maximum; -/** - * @serial The minimum value for this scrollbar - */ -private int minimum; + /** + * @serial The minimum value for this scrollbar + */ + private int minimum; -/** - * @serial The orientation of this scrollbar, which will be either - * the <code>HORIZONTAL</code> or <code>VERTICAL</code> constant - * from this class. - */ -private int orientation; + /** + * @serial The orientation of this scrollbar, which will be either + * the <code>HORIZONTAL</code> or <code>VERTICAL</code> constant + * from this class. + */ + private int orientation; -/** - * @serial The current value of this scrollbar. - */ -private int value; + /** + * @serial The current value of this scrollbar. + */ + private int value; -/** - * @serial The width of the scrollbar's thumb, which is relative - * to the minimum and maximum value of the scrollbar. - */ -private int visibleAmount; + /** + * @serial The width of the scrollbar's thumb, which is relative + * to the minimum and maximum value of the scrollbar. + */ + private int visibleAmount; -// List of AdjustmentListener's. -private AdjustmentListener adjustment_listeners; + /** + * List of AdjustmentListener's. + */ + private AdjustmentListener adjustment_listeners; -private transient boolean valueIsAdjusting = false; + /** + * true if the scrollbar is adjusting, false otherwise. + */ + private transient boolean valueIsAdjusting = false; - /* + /** * The number used to generate the name returned by getName. */ private static transient long next_scrollbar_number; -/*************************************************************************/ - -/* - * Constructors - */ - -/** - * Initializes a new instance of <code>Scrollbar</code> with a - * vertical orientation and default values for all other parameters. - * - * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true, - */ -public -Scrollbar() -{ - this(VERTICAL); -} - -/*************************************************************************/ - -/** - * Initializes a new instance of <code>Scrollbar</code> with the - * specified orientation and default values for all other parameters. - * The orientation must be either the constant <code>HORIZONTAL</code> or - * <code>VERTICAL</code> from this class. An incorrect value will throw - * an exception. - * - * @param orientation The orientation of this scrollbar. - * - * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true, - * @exception IllegalArgumentException If the orientation value is not valid. - */ -public -Scrollbar(int orientation) throws IllegalArgumentException -{ - this(orientation, 0, 10, 0, 100); -} - -/*************************************************************************/ - -/** - * Initializes a new instance of <code>Scrollbar</code> with the - * specified parameters. The orientation must be either the constant - * <code>HORIZONTAL</code> or <code>VERTICAL</code>. An incorrect value - * will throw an exception. Inconsistent values for other parameters - * are silently corrected to valid values. - * - * @param orientation The orientation of this scrollbar. - * @param value The initial value of the scrollbar. - * @param visibleAmount The width of the scrollbar thumb. - * @param minimum The minimum value of the scrollbar. - * @param maximum The maximum value of the scrollbar. - * - * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true, - * @exception IllegalArgumentException If the orientation value is not valid. - */ -public -Scrollbar(int orientation, int value, int visibleAmount, int minimum, - int maximum) throws IllegalArgumentException -{ - if (GraphicsEnvironment.isHeadless()) - throw new HeadlessException (); - - if ((orientation != HORIZONTAL) && (orientation != VERTICAL)) - throw new IllegalArgumentException("Bad orientation value: " - + orientation); - - this.orientation = orientation; - - setValues(value, visibleAmount, minimum, maximum); - - // Default is 1 according to online docs. - lineIncrement = 1; - - // Default is 10 according to javadocs. - pageIncrement = 10; -} - -/*************************************************************************/ - -/* - * Instance Methods - */ - -/** - * Returns the orientation constant for this object. - * - * @return The orientation constant for this object. - */ -public int -getOrientation() -{ - return(orientation); -} - -/*************************************************************************/ - -/** - * Sets the orientation of this scrollbar to the specified value. This - * value must be either the constant <code>HORIZONTAL</code> or - * <code>VERTICAL</code> from this class or an exception will be thrown. - * - * @param orientation The new orientation value. - * - * @exception IllegalArgumentException If the orientation value is not valid. - */ -public void -setOrientation(int orientation) -{ - if ((orientation != HORIZONTAL) && (orientation != VERTICAL)) - throw new IllegalArgumentException("Bad orientation value: " - + orientation); - - // FIXME: Communicate to peer? Or must this be called before peer creation? - this.orientation = orientation; -} - -/*************************************************************************/ - -/** - * Returns the current value for this scrollbar. - * - * @return The current value for this scrollbar. - */ -public int -getValue() -{ - return(value); -} - -/*************************************************************************/ - -/** - * Sets the current value for this scrollbar to the specified value. - * If this is inconsistent with the minimum and maximum values for this - * scrollbar, the value is silently adjusted. - * - * @param value The new value for this scrollbar. - */ -public void -setValue(int value) -{ - setValues(value, visibleAmount, minimum, maximum); -} - -/*************************************************************************/ - -/** - * Returns the maximum value for this scrollbar. - * - * @return The maximum value for this scrollbar. - */ -public int -getMaximum() -{ - return(maximum); -} - -/*************************************************************************/ - -/** - * Sets the maximum value for this scrollbar to the specified value. - * If the value is less than the current minimum value, it is silent - * set to equal the minimum value. - * - * @param maximum The new maximum value for this scrollbar. - */ -public void -setMaximum(int maximum) -{ - setValues(value, visibleAmount, minimum, maximum); -} - -/*************************************************************************/ - -/** - * Returns the minimum value for this scrollbar. - * - * @return The minimum value for this scrollbar. - */ -public int -getMinimum() -{ - return(minimum); -} - -/*************************************************************************/ - -/** - * Sets the minimum value for this scrollbar to the specified value. If - * this is not consistent with the current value and maximum, it is - * silently adjusted to be consistent. - * - * @param minimum The new minimum value for this scrollbar. - */ -public void -setMinimum(int minimum) -{ - setValues(value, visibleAmount, minimum, maximum); -} - -/*************************************************************************/ - -/** - * Returns the width of the scrollbar's thumb, in units relative to the - * maximum and minimum value of the scrollbar. - * - * @return The width of the scrollbar's thumb. - */ -public int -getVisibleAmount() -{ - return getVisible (); -} - -/*************************************************************************/ - -/** - * Returns the width of the scrollbar's thumb, in units relative to the - * maximum and minimum value of the scrollbar. - * - * @return The width of the scrollbar's thumb. - * - * @deprecated This method is deprecated in favor of - * <code>getVisibleAmount()</code>. - */ -public int -getVisible() -{ - return visibleAmount; -} - -/*************************************************************************/ - -/** - * Sets the width of the scrollbar's thumb, in units relative to the - * maximum and minimum value of the scrollbar. - * - * @param visibleAmount The new visible amount value of the scrollbar. - */ -public void -setVisibleAmount(int visibleAmount) -{ - setValues(value, visibleAmount, minimum, maximum); -} - -/*************************************************************************/ - -/** - * Sets the current value, visible amount, minimum, and maximum for this - * scrollbar. These values are adjusted to be internally consistent - * if necessary. - * - * @param value The new value for this scrollbar. - * @param visibleAmount The new visible amount for this scrollbar. - * @param minimum The new minimum value for this scrollbar. - * @param maximum The new maximum value for this scrollbar. - */ -public synchronized void -setValues(int value, int visibleAmount, int minimum, int maximum) -{ - if (maximum < minimum) - maximum = minimum; - - if (value < minimum) - value = minimum; - - if (value > maximum) - value = maximum; - - if (visibleAmount > maximum - minimum) - visibleAmount = maximum - minimum; - - ScrollbarPeer peer = (ScrollbarPeer) getPeer (); - if (peer != null - && (this.value != value || this.visibleAmount != visibleAmount - || this.minimum != minimum || this.maximum != maximum)) - peer.setValues(value, visibleAmount, minimum, maximum); - - this.value = value; - this.visibleAmount = visibleAmount; - this.minimum = minimum; - this.maximum = maximum; - - int range = maximum - minimum; - if (lineIncrement > range) - { - if (range == 0) - lineIncrement = 1; - else - lineIncrement = range; - - if (peer != null) - peer.setLineIncrement(lineIncrement); - } - - if (pageIncrement > range) - { - if (range == 0) - pageIncrement = 1; - else - pageIncrement = range; - - if (peer != null) - peer.setPageIncrement(pageIncrement); - } -} - -/*************************************************************************/ + /** + * Initializes a new instance of <code>Scrollbar</code> with a + * vertical orientation and default values for all other parameters. + * + * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true, + */ + public Scrollbar() + { + this(VERTICAL); + } -/** - * Returns the value added or subtracted when the user activates the scrollbar - * scroll by a "unit" amount. - * - * @return The unit increment value. - */ -public int -getUnitIncrement() -{ - return getLineIncrement (); -} + /** + * Initializes a new instance of <code>Scrollbar</code> with the + * specified orientation and default values for all other parameters. + * The orientation must be either the constant <code>HORIZONTAL</code> or + * <code>VERTICAL</code> from this class. An incorrect value will throw + * an exception. + * + * @param orientation The orientation of this scrollbar. + * + * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true, + * @exception IllegalArgumentException If the orientation value is not valid. + */ + public Scrollbar(int orientation) throws IllegalArgumentException + { + this(orientation, 0, 10, 0, 100); + } -/*************************************************************************/ + /** + * Initializes a new instance of <code>Scrollbar</code> with the + * specified parameters. The orientation must be either the constant + * <code>HORIZONTAL</code> or <code>VERTICAL</code>. An incorrect value + * will throw an exception. Inconsistent values for other parameters + * are silently corrected to valid values. + * + * @param orientation The orientation of this scrollbar. + * @param value The initial value of the scrollbar. + * @param visibleAmount The width of the scrollbar thumb. + * @param minimum The minimum value of the scrollbar. + * @param maximum The maximum value of the scrollbar. + * + * @exception HeadlessException If GraphicsEnvironment.isHeadless() is true, + * @exception IllegalArgumentException If the orientation value is not valid. + */ + public Scrollbar(int orientation, int value, int visibleAmount, int minimum, + int maximum) throws IllegalArgumentException + { + if (GraphicsEnvironment.isHeadless()) + throw new HeadlessException(); -/** - * Returns the value added or subtracted when the user selects the scrollbar - * scroll by a "unit" amount control. - * - * @return The unit increment value. - * - * @deprecated This method is deprecated in favor of - * <code>getUnitIncrement()</code>. - */ -public int -getLineIncrement() -{ - return lineIncrement; -} + if ((orientation != HORIZONTAL) && (orientation != VERTICAL)) + throw new IllegalArgumentException("Bad orientation value: " + + orientation); -/*************************************************************************/ + this.orientation = orientation; -/** - * Sets the value added or subtracted to the scrollbar value when the - * user selects the scroll by a "unit" amount control. - * - * @param unitIncrement The new unit increment amount. - */ -public synchronized void -setUnitIncrement(int unitIncrement) -{ - setLineIncrement (unitIncrement); -} + setValues(value, visibleAmount, minimum, maximum); -/*************************************************************************/ + // Default is 1 according to online docs. + lineIncrement = 1; -/** - * Sets the value added or subtracted to the scrollbar value when the - * user selects the scroll by a "unit" amount control. - * - * @param lineIncrement The new unit increment amount. - * - * @deprecated This method is deprecated in favor of - * <code>setUnitIncrement()</code>. - */ -public void -setLineIncrement(int lineIncrement) -{ - if (lineIncrement < 0) - throw new IllegalArgumentException ("Unit increment less than zero."); + // Default is 10 according to javadocs. + pageIncrement = 10; + } - int range = maximum - minimum; - if (lineIncrement > range) - { - if (range == 0) - lineIncrement = 1; - else - lineIncrement = range; - } + /** + * Returns the orientation constant for this object. + * + * @return The orientation constant for this object. + */ + public int getOrientation() + { + return orientation; + } - if (lineIncrement == this.lineIncrement) - return; + /** + * Sets the orientation of this scrollbar to the specified value. This + * value must be either the constant <code>HORIZONTAL</code> or + * <code>VERTICAL</code> from this class or an exception will be thrown. + * + * @param orientation The new orientation value. + * + * @exception IllegalArgumentException If the orientation value is not valid. + */ + public void setOrientation(int orientation) + { + if ((orientation != HORIZONTAL) && (orientation != VERTICAL)) + throw new IllegalArgumentException("Bad orientation value: " + + orientation); - this.lineIncrement = lineIncrement; + // FIXME: Communicate to peer? Or must this be called before peer creation? + this.orientation = orientation; + } - ScrollbarPeer peer = (ScrollbarPeer) getPeer (); - if (peer != null) - peer.setLineIncrement (this.lineIncrement); -} + /** + * Returns the current value for this scrollbar. + * + * @return The current value for this scrollbar. + */ + public int getValue() + { + return value; + } -/*************************************************************************/ + /** + * Sets the current value for this scrollbar to the specified value. + * If this is inconsistent with the minimum and maximum values for this + * scrollbar, the value is silently adjusted. + * + * @param value The new value for this scrollbar. + */ + public void setValue(int value) + { + setValues(value, visibleAmount, minimum, maximum); + } -/** - * Returns the value added or subtracted when the user activates the scrollbar - * scroll by a "block" amount. - * - * @return The block increment value. - */ -public int -getBlockIncrement() -{ - return getPageIncrement (); -} + /** + * Returns the maximum value for this scrollbar. + * + * @return The maximum value for this scrollbar. + */ + public int getMaximum() + { + return maximum; + } -/*************************************************************************/ + /** + * Sets the maximum value for this scrollbar to the specified value. + * If the value is less than the current minimum value, it is silent + * set to equal the minimum value. + * + * @param maximum The new maximum value for this scrollbar. + */ + public void setMaximum(int maximum) + { + setValues(value, visibleAmount, minimum, maximum); + } -/** - * Returns the value added or subtracted when the user selects the scrollbar - * scroll by a "block" amount control. - * - * @return The block increment value. - * - * @deprecated This method is deprecated in favor of - * <code>getBlockIncrement()</code>. - */ -public int -getPageIncrement() -{ - return pageIncrement; -} + /** + * Returns the minimum value for this scrollbar. + * + * @return The minimum value for this scrollbar. + */ + public int getMinimum() + { + return minimum; + } -/*************************************************************************/ + /** + * Sets the minimum value for this scrollbar to the specified value. If + * this is not consistent with the current value and maximum, it is + * silently adjusted to be consistent. + * + * @param minimum The new minimum value for this scrollbar. + */ + public void setMinimum(int minimum) + { + setValues(value, visibleAmount, minimum, maximum); + } -/** - * Sets the value added or subtracted to the scrollbar value when the - * user selects the scroll by a "block" amount control. - * - * @param blockIncrement The new block increment amount. - */ -public synchronized void -setBlockIncrement(int blockIncrement) -{ - setPageIncrement (blockIncrement); -} + /** + * Returns the width of the scrollbar's thumb, in units relative to the + * maximum and minimum value of the scrollbar. + * + * @return The width of the scrollbar's thumb. + */ + public int getVisibleAmount() + { + return getVisible(); + } -/*************************************************************************/ + /** + * Returns the width of the scrollbar's thumb, in units relative to the + * maximum and minimum value of the scrollbar. + * + * @return The width of the scrollbar's thumb. + * + * @deprecated This method is deprecated in favor of + * <code>getVisibleAmount()</code>. + */ + public int getVisible() + { + return visibleAmount; + } -/** - * Sets the value added or subtracted to the scrollbar value when the - * user selects the scroll by a "block" amount control. - * - * @param pageIncrement The new block increment amount. - * - * @deprecated This method is deprecated in favor of - * <code>setBlockIncrement()</code>. - */ -public void -setPageIncrement(int pageIncrement) -{ - if (pageIncrement < 0) - throw new IllegalArgumentException ("Block increment less than zero."); + /** + * Sets the width of the scrollbar's thumb, in units relative to the + * maximum and minimum value of the scrollbar. + * + * @param visibleAmount The new visible amount value of the scrollbar. + */ + public void setVisibleAmount(int visibleAmount) + { + setValues(value, visibleAmount, minimum, maximum); + } - int range = maximum - minimum; - if (pageIncrement > range) - { - if (range == 0) - pageIncrement = 1; - else - pageIncrement = range; - } + /** + * Sets the current value, visible amount, minimum, and maximum for this + * scrollbar. These values are adjusted to be internally consistent + * if necessary. + * + * @param value The new value for this scrollbar. + * @param visibleAmount The new visible amount for this scrollbar. + * @param minimum The new minimum value for this scrollbar. + * @param maximum The new maximum value for this scrollbar. + */ + public synchronized void setValues(int value, int visibleAmount, + int minimum, int maximum) + { + if (maximum < minimum) + maximum = minimum; + + if (value < minimum) + value = minimum; + + if (value > maximum) + value = maximum; + + if (visibleAmount > maximum - minimum) + visibleAmount = maximum - minimum; + + ScrollbarPeer peer = (ScrollbarPeer) getPeer(); + if (peer != null + && (this.value != value || this.visibleAmount != visibleAmount + || this.minimum != minimum || this.maximum != maximum)) + peer.setValues(value, visibleAmount, minimum, maximum); + + this.value = value; + this.visibleAmount = visibleAmount; + this.minimum = minimum; + this.maximum = maximum; + + int range = maximum - minimum; + if (lineIncrement > range) + { + if (range == 0) + lineIncrement = 1; + else + lineIncrement = range; + + if (peer != null) + peer.setLineIncrement(lineIncrement); + } + + if (pageIncrement > range) + { + if (range == 0) + pageIncrement = 1; + else + pageIncrement = range; + + if (peer != null) + peer.setPageIncrement(pageIncrement); + } + } - if (pageIncrement == this.pageIncrement) - return; + /** + * Returns the value added or subtracted when the user activates the scrollbar + * scroll by a "unit" amount. + * + * @return The unit increment value. + */ + public int getUnitIncrement() + { + return getLineIncrement(); + } - this.pageIncrement = pageIncrement; + /** + * Returns the value added or subtracted when the user selects the scrollbar + * scroll by a "unit" amount control. + * + * @return The unit increment value. + * + * @deprecated This method is deprecated in favor of + * <code>getUnitIncrement()</code>. + */ + public int getLineIncrement() + { + return lineIncrement; + } - ScrollbarPeer peer = (ScrollbarPeer) getPeer (); - if (peer != null) - peer.setPageIncrement (this.pageIncrement); -} + /** + * Sets the value added or subtracted to the scrollbar value when the + * user selects the scroll by a "unit" amount control. + * + * @param unitIncrement The new unit increment amount. + */ + public synchronized void setUnitIncrement(int unitIncrement) + { + setLineIncrement(unitIncrement); + } -/*************************************************************************/ + /** + * Sets the value added or subtracted to the scrollbar value when the + * user selects the scroll by a "unit" amount control. + * + * @param lineIncrement The new unit increment amount. + * + * @deprecated This method is deprecated in favor of + * <code>setUnitIncrement()</code>. + */ + public void setLineIncrement(int lineIncrement) + { + if (lineIncrement < 0) + throw new IllegalArgumentException("Unit increment less than zero."); + + int range = maximum - minimum; + if (lineIncrement > range) + { + if (range == 0) + lineIncrement = 1; + else + lineIncrement = range; + } + + if (lineIncrement == this.lineIncrement) + return; + + this.lineIncrement = lineIncrement; + + ScrollbarPeer peer = (ScrollbarPeer) getPeer(); + if (peer != null) + peer.setLineIncrement(this.lineIncrement); + } -/** - * Notifies this object to create its native peer. - */ -public synchronized void -addNotify() -{ - if (peer == null) - peer = getToolkit ().createScrollbar (this); - super.addNotify (); -} + /** + * Returns the value added or subtracted when the user activates the scrollbar + * scroll by a "block" amount. + * + * @return The block increment value. + */ + public int getBlockIncrement() + { + return getPageIncrement(); + } -/*************************************************************************/ + /** + * Returns the value added or subtracted when the user selects the scrollbar + * scroll by a "block" amount control. + * + * @return The block increment value. + * + * @deprecated This method is deprecated in favor of + * <code>getBlockIncrement()</code>. + */ + public int getPageIncrement() + { + return pageIncrement; + } -/** - * Adds a new adjustment listener to the list of registered listeners - * for this object. - * - * @param listener The listener to add. - */ -public synchronized void -addAdjustmentListener(AdjustmentListener listener) -{ - adjustment_listeners = AWTEventMulticaster.add(adjustment_listeners, listener); - enableEvents(AWTEvent.ADJUSTMENT_EVENT_MASK); -} + /** + * Sets the value added or subtracted to the scrollbar value when the + * user selects the scroll by a "block" amount control. + * + * @param blockIncrement The new block increment amount. + */ + public synchronized void setBlockIncrement(int blockIncrement) + { + setPageIncrement(blockIncrement); + } -/*************************************************************************/ + /** + * Sets the value added or subtracted to the scrollbar value when the + * user selects the scroll by a "block" amount control. + * + * @param pageIncrement The new block increment amount. + * + * @deprecated This method is deprecated in favor of + * <code>setBlockIncrement()</code>. + */ + public void setPageIncrement(int pageIncrement) + { + if (pageIncrement < 0) + throw new IllegalArgumentException("Block increment less than zero."); + + int range = maximum - minimum; + if (pageIncrement > range) + { + if (range == 0) + pageIncrement = 1; + else + pageIncrement = range; + } + + if (pageIncrement == this.pageIncrement) + return; + + this.pageIncrement = pageIncrement; + + ScrollbarPeer peer = (ScrollbarPeer) getPeer(); + if (peer != null) + peer.setPageIncrement(this.pageIncrement); + } -/** - * Removes the specified listener from the list of registered listeners - * for this object. - * - * @param listener The listener to remove. - */ -public synchronized void -removeAdjustmentListener(AdjustmentListener listener) -{ - adjustment_listeners = AWTEventMulticaster.remove(adjustment_listeners, - listener); -} + /** + * Notifies this object to create its native peer. + */ + public synchronized void addNotify() + { + if (peer == null) + peer = getToolkit().createScrollbar(this); + super.addNotify(); + } -/*************************************************************************/ + /** + * Adds a new adjustment listener to the list of registered listeners + * for this object. + * + * @param listener The listener to add. + */ + public synchronized void addAdjustmentListener(AdjustmentListener listener) + { + adjustment_listeners = AWTEventMulticaster.add(adjustment_listeners, + listener); + enableEvents(AWTEvent.ADJUSTMENT_EVENT_MASK); + } -/** - * Processes events for this scrollbar. It does this by calling - * <code>processAdjustmentEvent()</code> if the event is an instance of - * <code>AdjustmentEvent</code>, otherwise it calls the superclass to - * process the event. - * - * @param event The event to process. - */ -protected void -processEvent(AWTEvent event) -{ - if (event instanceof AdjustmentEvent) - processAdjustmentEvent((AdjustmentEvent)event); - else - super.processEvent(event); -} + /** + * Removes the specified listener from the list of registered listeners + * for this object. + * + * @param listener The listener to remove. + */ + public synchronized void removeAdjustmentListener(AdjustmentListener listener) + { + adjustment_listeners = AWTEventMulticaster.remove(adjustment_listeners, + listener); + } -/*************************************************************************/ + /** + * Processes events for this scrollbar. It does this by calling + * <code>processAdjustmentEvent()</code> if the event is an instance of + * <code>AdjustmentEvent</code>, otherwise it calls the superclass to + * process the event. + * + * @param event The event to process. + */ + protected void processEvent(AWTEvent event) + { + if (event instanceof AdjustmentEvent) + processAdjustmentEvent((AdjustmentEvent) event); + else + super.processEvent(event); + } -/** - * Processes adjustment events for this object by dispatching them to - * any registered listeners. Note that this method will only be called - * if adjustment events are enabled. This will happen automatically if - * any listeners are registered. Otherwise, it can be enabled by a - * call to <code>enableEvents()</code>. - * - * @param event The event to process. - */ -protected void -processAdjustmentEvent(AdjustmentEvent event) -{ - value = event.getValue(); - if (adjustment_listeners != null) - adjustment_listeners.adjustmentValueChanged(event); -} + /** + * Processes adjustment events for this object by dispatching them to + * any registered listeners. Note that this method will only be called + * if adjustment events are enabled. This will happen automatically if + * any listeners are registered. Otherwise, it can be enabled by a + * call to <code>enableEvents()</code>. + * + * @param event The event to process. + */ + protected void processAdjustmentEvent(AdjustmentEvent event) + { + value = event.getValue(); + if (adjustment_listeners != null) + adjustment_listeners.adjustmentValueChanged(event); + } -void -dispatchEventImpl(AWTEvent e) -{ - if (e.id <= AdjustmentEvent.ADJUSTMENT_LAST + void dispatchEventImpl(AWTEvent e) + { + if (e.id <= AdjustmentEvent.ADJUSTMENT_LAST && e.id >= AdjustmentEvent.ADJUSTMENT_FIRST && (adjustment_listeners != null || (eventMask & AWTEvent.ADJUSTMENT_EVENT_MASK) != 0)) - processEvent(e); - else - super.dispatchEventImpl(e); -} - -/*************************************************************************/ + processEvent(e); + else + super.dispatchEventImpl(e); + } -/** - * Returns a debugging string for this object. - * - * @return A debugging string for this object. - */ -protected String -paramString() -{ - return("value=" + getValue() + ",visibleAmount=" + - getVisibleAmount() + ",minimum=" + getMinimum() - + ",maximum=" + getMaximum() - + ",pageIncrement=" + pageIncrement - + ",lineIncrement=" + lineIncrement - + ",orientation=" + (orientation == HORIZONTAL - ? "HORIZONTAL" : "VERTICAL") - + super.paramString()); -} + /** + * Returns a debugging string for this object. + * + * @return A debugging string for this object. + */ + protected String paramString() + { + return ("value=" + getValue() + ",visibleAmount=" + getVisibleAmount() + + ",minimum=" + getMinimum() + ",maximum=" + getMaximum() + + ",pageIncrement=" + pageIncrement + ",lineIncrement=" + + lineIncrement + ",orientation=" + + (orientation == HORIZONTAL ? "HORIZONTAL" : "VERTICAL") + + super.paramString()); + } /** * Returns an array of all the objects currently registered as FooListeners - * upon this <code>Scrollbar</code>. FooListeners are registered using the + * upon this <code>Scrollbar</code>. FooListeners are registered using the * addFooListener method. * * @exception ClassCastException If listenerType doesn't specify a class or * interface that implements java.util.EventListener. */ - public EventListener[] getListeners (Class listenerType) + public EventListener[] getListeners(Class listenerType) { if (listenerType == AdjustmentListener.class) - return AWTEventMulticaster.getListeners (adjustment_listeners, - listenerType); + return AWTEventMulticaster.getListeners(adjustment_listeners, + listenerType); - return super.getListeners (listenerType); + return super.getListeners(listenerType); } /** * Returns an array of all registered adjustment listeners. */ - public AdjustmentListener[] getAdjustmentListeners () + public AdjustmentListener[] getAdjustmentListeners() { - return (AdjustmentListener[]) getListeners (AdjustmentListener.class); + return (AdjustmentListener[]) getListeners(AdjustmentListener.class); } /** @@ -740,7 +649,7 @@ paramString() * * @since 1.4 */ - public boolean getValueIsAdjusting () + public boolean getValueIsAdjusting() { return valueIsAdjusting; } @@ -750,7 +659,7 @@ paramString() * * @since 1.4 */ - public void setValueIsAdjusting (boolean valueIsAdjusting) + public void setValueIsAdjusting(boolean valueIsAdjusting) { this.valueIsAdjusting = valueIsAdjusting; } @@ -760,14 +669,157 @@ paramString() * * @return A unique name for this scroll bar. */ - String generateName () + String generateName() { - return "scrollbar" + getUniqueLong (); + return "scrollbar" + getUniqueLong(); } - private static synchronized long getUniqueLong () + private static synchronized long getUniqueLong() { return next_scrollbar_number++; } -} // class Scrollbar + /** + * This class provides accessibility support for the + * scrollbar. + * + * @author Jerry Quinn (jlquinn@optonline.net) + * @author Andrew John Hughes (gnu_andrew@member.fsf.org) + */ + protected class AccessibleAWTScrollBar extends AccessibleAWTComponent + implements AccessibleValue + { + /** + * Serialization constant to match JDK 1.5 + */ + private static final long serialVersionUID = -344337268523697807L; + + /** + * Returns the role of this accessible object. + * + * @return the instance of <code>AccessibleRole</code>, + * which describes this object. + * + * @see javax.accessibility.AccessibleRole + */ + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.SCROLL_BAR; + } + + /** + * Returns the state set of this accessible object. + * + * @return a set of <code>AccessibleState</code>s which + * represent the current state of the accessible object. + * + * @see javax.accessibility.AccessibleState + * @see javax.accessibility.AccessibleStateSet + */ + public AccessibleStateSet getAccessibleStateSet() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + if (getOrientation() == HORIZONTAL) + states.add(AccessibleState.HORIZONTAL); + else + states.add(AccessibleState.VERTICAL); + if (getValueIsAdjusting()) + states.add(AccessibleState.BUSY); + return states; + } + + /** + * Returns an implementation of the <code>AccessibleValue</code> + * interface for this accessible object. In this case, the + * current instance is simply returned (with a more appropriate + * type), as it also implements the accessible value as well as + * the context. + * + * @return the accessible value associated with this context. + * + * @see javax.accessibility.AccessibleValue + */ + public AccessibleValue getAccessibleValue() + { + return this; + } + + /** + * Returns the current value of this accessible object. + * In this case, this is the same as the value for + * the scrollbar, wrapped in an <code>Integer</code> + * object. + * + * @return the numeric value of this scrollbar. + * + * @see javax.accessibility.AccessibleValue#getCurrentAccessibleValue() + */ + public Number getCurrentAccessibleValue() + { + return new Integer(getValue()); + } + + /** + * Sets the current value of this accessible object + * to that supplied. In this case, the value of the + * scrollbar is set, and this method always returns + * true. + * + * @param number the new accessible value. + * + * @return true if the value was set. + * + * @see javax.accessibility.AccessibleValue#setCurrentAccessibleValue(java.lang.Number) + */ + public boolean setCurrentAccessibleValue(Number number) + { + setValue(number.intValue()); + return true; + } + + /** + * Returns the minimum acceptable accessible value used + * by this object. In this case, this is the same as + * the minimum value of the scrollbar, wrapped in an + * object. + * + * @return the minimum value of this scrollbar. + * + * @see javax.accessibility.AccessibleValue#getMinimumAccessibleValue() + */ + public Number getMinimumAccessibleValue() + { + return new Integer(getMinimum()); + } + + /** + * Returns the maximum acceptable accessible value used + * by this object. In this case, this is the same as + * the maximum value of the scrollbar, wrapped in an + * object. + * + * @return the maximum value of this scrollbar. + * + * @see javax.accessibility.AccessibleValue#getMaximumAccessibleValue() + */ + public Number getMaximumAccessibleValue() + { + return new Integer(getMaximum()); + } + } + + /** + * Gets the AccessibleContext associated with this <code>Scrollbar</code>. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTScrollBar(); + + return accessibleContext; + } +} diff --git a/libjava/java/awt/TextArea.java b/libjava/java/awt/TextArea.java index 9efc775..dda45f3 100644 --- a/libjava/java/awt/TextArea.java +++ b/libjava/java/awt/TextArea.java @@ -613,8 +613,17 @@ public class TextArea extends TextComponent implements java.io.Serializable } } + /** + * Gets the AccessibleContext associated with this <code>TextArea</code>. + * The context is created, if necessary. + * + * @return the associated context + */ public AccessibleContext getAccessibleContext() { - return new AccessibleAWTTextArea(); + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTTextArea(); + return accessibleContext; } } diff --git a/libjava/java/awt/TextComponent.java b/libjava/java/awt/TextComponent.java index 8f9f875..4c38439 100644 --- a/libjava/java/awt/TextComponent.java +++ b/libjava/java/awt/TextComponent.java @@ -46,6 +46,7 @@ import java.text.BreakIterator; import java.util.EventListener; import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; import javax.accessibility.AccessibleRole; import javax.accessibility.AccessibleState; import javax.accessibility.AccessibleStateSet; @@ -690,6 +691,21 @@ paramString() return (TextListener[]) getListeners (TextListener.class); } + /** + * Gets the AccessibleContext associated with this <code>TextComponent</code>. + * The context is created, if necessary. + * + * @return the associated context + */ + public AccessibleContext getAccessibleContext() + { + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTTextComponent(); + return accessibleContext; + } + + /*******************************/ // Provide AccessibleAWTTextComponent access to several peer functions that // aren't publicly exposed. diff --git a/libjava/java/awt/Toolkit.java b/libjava/java/awt/Toolkit.java index 504572a..f1925a2 100644 --- a/libjava/java/awt/Toolkit.java +++ b/libjava/java/awt/Toolkit.java @@ -526,6 +526,10 @@ public abstract class Toolkit toolkit = (Toolkit) obj; return toolkit; } + catch (ThreadDeath death) + { + throw death; + } catch (Throwable t) { AWTError e = new AWTError("Cannot load AWT toolkit: " + toolkit_name); diff --git a/libjava/java/awt/Window.java b/libjava/java/awt/Window.java index d084bb4..786e51a 100644 --- a/libjava/java/awt/Window.java +++ b/libjava/java/awt/Window.java @@ -56,6 +56,9 @@ import java.util.Vector; import javax.accessibility.Accessible; import javax.accessibility.AccessibleContext; +import javax.accessibility.AccessibleRole; +import javax.accessibility.AccessibleState; +import javax.accessibility.AccessibleStateSet; /** * This class represents a top-level window with no decorations. @@ -84,11 +87,26 @@ public class Window extends Container implements Accessible private transient WindowFocusListener windowFocusListener; private transient WindowStateListener windowStateListener; private transient GraphicsConfiguration graphicsConfiguration; - private transient AccessibleContext accessibleContext; private transient boolean shown; private transient Component windowFocusOwner; + + protected class AccessibleAWTWindow extends AccessibleAWTContainer + { + public AccessibleRole getAccessibleRole() + { + return AccessibleRole.WINDOW; + } + + public AccessibleStateSet getAccessibleStateSet() + { + AccessibleStateSet states = super.getAccessibleStateSet(); + if (isActive()) + states.add(AccessibleState.ACTIVE); + return states; + } + } /** * This (package access) constructor is used by subclasses that want @@ -200,12 +218,11 @@ public class Window extends Container implements Accessible && gc.getDevice().getType() != GraphicsDevice.TYPE_RASTER_SCREEN) throw new IllegalArgumentException ("gc must be from a screen device"); - // FIXME: until we implement this, it just causes AWT to crash. -// if (gc == null) -// graphicsConfiguration = GraphicsEnvironment.getLocalGraphicsEnvironment() -// .getDefaultScreenDevice() -// .getDefaultConfiguration(); -// else + if (gc == null) + graphicsConfiguration = GraphicsEnvironment.getLocalGraphicsEnvironment() + .getDefaultScreenDevice() + .getDefaultConfiguration(); + else graphicsConfiguration = gc; } @@ -672,8 +689,34 @@ public class Window extends Container implements Accessible } } } + + /** + * Identifies if this window is active. The active window is a Frame or + * Dialog that has focus or owns the active window. + * + * @return true if active, else false. + * @since 1.4 + */ + public boolean isActive() + { + KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); + return manager.getActiveWindow() == this; + } /** + * Identifies if this window is focused. A window is focused if it is the + * focus owner or it contains the focus owner. + * + * @return true if focused, else false. + * @since 1.4 + */ + public boolean isFocused() + { + KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); + return manager.getFocusedWindow() == this; + } + + /** * Returns the child window that has focus if this window is active. * This method returns <code>null</code> if this window is not active * or no children have focus. @@ -731,6 +774,22 @@ public class Window extends Container implements Accessible return super.isShowing(); } + public void setLocationRelativeTo (Component c) + { + if (c == null || !c.isShowing ()) + { + int x = 0; + int y = 0; + + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment (); + Point center = ge.getCenterPoint (); + x = center.x - (width / 2); + y = center.y - (height / 2); + setLocation (x, y); + } + // FIXME: handle case where component is non-null. + } + /** * @since 1.2 * @@ -754,11 +813,18 @@ public class Window extends Container implements Accessible applyResourceBundle(rb); } + /** + * Gets the AccessibleContext associated with this <code>Window</code>. + * The context is created, if necessary. + * + * @return the associated context + */ public AccessibleContext getAccessibleContext() { - // FIXME - //return null; - throw new Error ("Not implemented"); + /* Create the context if this is the first request */ + if (accessibleContext == null) + accessibleContext = new AccessibleAWTWindow(); + return accessibleContext; } /** @@ -866,13 +932,13 @@ public class Window extends Container implements Accessible this.y = y; width = w; height = h; - if (resized) + if (resized && isShowing ()) { ComponentEvent ce = new ComponentEvent(this, ComponentEvent.COMPONENT_RESIZED); getToolkit().getSystemEventQueue().postEvent(ce); } - if (moved) + if (moved && isShowing ()) { ComponentEvent ce = new ComponentEvent(this, ComponentEvent.COMPONENT_MOVED); diff --git a/libjava/java/awt/color/ICC_Profile.java b/libjava/java/awt/color/ICC_Profile.java index 79aa886..b84eb96 100644 --- a/libjava/java/awt/color/ICC_Profile.java +++ b/libjava/java/awt/color/ICC_Profile.java @@ -316,8 +316,6 @@ public class ICC_Profile implements Serializable */ protected void finalize() { - header = null; - tagTable = null; } /** diff --git a/libjava/java/awt/dnd/DnDConstants.java b/libjava/java/awt/dnd/DnDConstants.java index 3e78121..a64fa5a 100644 --- a/libjava/java/awt/dnd/DnDConstants.java +++ b/libjava/java/awt/dnd/DnDConstants.java @@ -1,5 +1,5 @@ /* DnDConstants.java -- constants for drag-and-drop operations - Copyright (C) 2002 Free Software Foundation, Inc. + Copyright (C) 2002, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -69,4 +69,9 @@ public final class DnDConstants /** A synonym for {@link #ACTION_LINK}. */ public static final int ACTION_REFERENCE = ACTION_LINK; -} // class DnDConstants + + private DnDConstants() + { + // Do nothing here. + } +} diff --git a/libjava/java/awt/dnd/DropTarget.java b/libjava/java/awt/dnd/DropTarget.java index 7379ca7..2a8b79d 100644 --- a/libjava/java/awt/dnd/DropTarget.java +++ b/libjava/java/awt/dnd/DropTarget.java @@ -205,15 +205,14 @@ public class DropTarget /** * Adds a new <code>DropTargetListener</code>. * - * @exception TooManyListenersException If there is already a - * <code>DropTargetListener</code>. + * @exception TooManyListenersException Sun's JDK does not, despite + * documentation, throw this exception here when you install an additional + * <code>DropTargetListener</code>. So to be compatible, we do the same + * thing. */ public void addDropTargetListener (DropTargetListener dtl) throws TooManyListenersException { - if (dtl != null) - throw new TooManyListenersException (); - dropTargetListener = dtl; } diff --git a/libjava/java/awt/geom/Area.java b/libjava/java/awt/geom/Area.java index 9b1b9d3..68f905f 100644 --- a/libjava/java/awt/geom/Area.java +++ b/libjava/java/awt/geom/Area.java @@ -2631,11 +2631,9 @@ public class Area implements Shape, Cloneable double P = (y2 - 2 * y1 + y0); double Q = 2 * (y1 - y0); - double R = y0; double A = (x2 - 2 * x1 + x0); double B = 2 * (x1 - x0); - double C = x0; double area = (B * P - A * Q) / 3.0; return (area); @@ -2937,12 +2935,10 @@ public class Area implements Shape, Cloneable double P = y3 - 3 * y2 + 3 * y1 - y0; double Q = 3 * (y2 + y0 - 2 * y1); double R = 3 * (y1 - y0); - double S = y0; double A = x3 - 3 * x2 + 3 * x1 - x0; double B = 3 * (x2 + x0 - 2 * x1); double C = 3 * (x1 - x0); - double D = x0; double area = (B * P - A * Q) / 5.0 + (C * P - A * R) / 2.0 + (C * Q - B * R) / 3.0; diff --git a/libjava/java/awt/geom/Rectangle2D.java b/libjava/java/awt/geom/Rectangle2D.java index bd1a37c..d8217fe 100644 --- a/libjava/java/awt/geom/Rectangle2D.java +++ b/libjava/java/awt/geom/Rectangle2D.java @@ -1,5 +1,5 @@ /* Rectangle2D.java -- generic rectangles in 2-D space - Copyright (C) 2000, 2001, 2002 Free Software Foundation + Copyright (C) 2000, 2001, 2002, 2004 Free Software Foundation This file is part of GNU Classpath. @@ -57,30 +57,30 @@ import java.util.NoSuchElementException; public abstract class Rectangle2D extends RectangularShape { /** - * The point lies left of the rectangle (p.x < r.x). + * The point lies left of the rectangle (p.x < r.x). * - * @see #outcode() + * @see #outcode(double, double) */ public static final int OUT_LEFT = 1; /** - * The point lies above the rectangle (p.y < r.y). + * The point lies above the rectangle (p.y < r.y). * - * @see #outcode() + * @see #outcode(double, double) */ public static final int OUT_TOP = 2; /** * The point lies right of the rectangle (p.x > r.maxX). * - * @see #outcode() + * @see #outcode(double, double) */ public static final int OUT_RIGHT = 4; /** * The point lies below of the rectangle (p.y > r.maxY). * - * @see #outcode() + * @see #outcode(double, double) */ public static final int OUT_BOTTOM = 8; diff --git a/libjava/java/awt/im/InputContext.java b/libjava/java/awt/im/InputContext.java index 04e70e3..fc068c2 100644 --- a/libjava/java/awt/im/InputContext.java +++ b/libjava/java/awt/im/InputContext.java @@ -102,8 +102,8 @@ public class InputContext while (e.hasMoreElements()) { URL url = (URL) e.nextElement(); - BufferedReader in = null; - String line = null; + BufferedReader in; + String line; try { in = new BufferedReader diff --git a/libjava/java/awt/image/IndexColorModel.java b/libjava/java/awt/image/IndexColorModel.java index 6791589..e4ccc54 100644 --- a/libjava/java/awt/image/IndexColorModel.java +++ b/libjava/java/awt/image/IndexColorModel.java @@ -125,7 +125,9 @@ public class IndexColorModel extends ColorModel public IndexColorModel(int bits, int size, byte[] reds, byte[] greens, byte[] blues, byte[] alphas) { - super (bits); + // FIXME: This super() constructor should not be used since it can give + // the wrong value for hasAlpha() which is final and cannot be overloaded + super(bits); map_size = size; opaque = (alphas == null); @@ -416,10 +418,10 @@ public class IndexColorModel extends ColorModel */ public final int getAlpha (int pixel) { - if (pixel < map_size) - return (int) ((generateMask (3) & rgb[pixel]) >> (3 * pixel_bits)); - - return 0; + if (opaque || pixel >= map_size) + return 255; + + return (int) ((generateMask (3) & rgb[pixel]) >> (3 * pixel_bits)); } /** diff --git a/libjava/java/awt/image/MemoryImageSource.java b/libjava/java/awt/image/MemoryImageSource.java index 07e42cf..6b43d00 100644 --- a/libjava/java/awt/image/MemoryImageSource.java +++ b/libjava/java/awt/image/MemoryImageSource.java @@ -1,4 +1,4 @@ -/* MemoryImageSource.java -- Java class for providing image data +/* MemoryImageSource.java -- Java class for providing image data Copyright (C) 1999, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -41,335 +41,333 @@ package java.awt.image; import java.util.Hashtable; import java.util.Vector; -public class MemoryImageSource implements ImageProducer +public class MemoryImageSource implements ImageProducer { - private boolean animated = false; - private boolean fullbuffers = false; - private int pixeli[], width, height, offset, scansize; - private byte pixelb[]; - private ColorModel cm; - private Hashtable props = new Hashtable(); - private Vector consumers = new Vector(); - - /** - * Construct an image producer that reads image data from a byte - * array. - * - * @param w width of image - * @param h height of image - * @param cm the color model used to represent pixel values - * @param pix a byte array of pixel values - * @param off the offset into the array at which the first pixel is stored - * @param scan the number of array elements that represents a single pixel row - */ - public MemoryImageSource(int w, int h, ColorModel cm, - byte pix[], int off, int scan) - { - this ( w, h, cm, pix, off, scan, null ); - } - /** - Constructs an ImageProducer from memory - */ - public MemoryImageSource( int w, int h, ColorModel cm, - byte pix[], int off, int scan, - Hashtable props) - { - width = w; - height = h; - this.cm = cm; - offset = off; - scansize = scan; - this.props = props; - int max = (( scansize > width ) ? scansize : width ); - pixelb = pix; - } - /** - * Construct an image producer that reads image data from an - * integer array. - * - * @param w width of image - * @param h height of image - * @param cm the color model used to represent pixel values - * @param pix an integer array of pixel values - * @param off the offset into the array at which the first pixel is stored - * @param scan the number of array elements that represents a single pixel row - */ - public MemoryImageSource(int w, int h, ColorModel cm, - int pix[], int off, int scan) - { - this ( w, h, cm, pix, off, scan, null ); - } - - /** - Constructs an ImageProducer from memory - */ - public MemoryImageSource(int w, int h, ColorModel cm, - int pix[], int off, int scan, - Hashtable props) - { - width = w; - height = h; - this.cm = cm; - offset = off; - scansize = scan; - this.props = props; - int max = (( scansize > width ) ? scansize : width ); - pixeli = pix; - } - /** - Constructs an ImageProducer from memory using the default RGB ColorModel - */ - public MemoryImageSource(int w, int h, - int pix[], int off, int scan, - Hashtable props) - { - this ( w, h, ColorModel.getRGBdefault(), pix, off, scan, props); - } - - /** - Constructs an ImageProducer from memory using the default RGB ColorModel - */ - public MemoryImageSource(int w, int h, - int pix[], int off, int scan) - { - this ( w, h, ColorModel.getRGBdefault(), pix, off, scan, null); - } - - /** - * Used to register an <code>ImageConsumer</code> with this - * <code>ImageProducer</code>. - */ - public synchronized void addConsumer(ImageConsumer ic) { - if (consumers.contains(ic)) - return; - - consumers.addElement(ic); - } - - /** - * Used to determine if the given <code>ImageConsumer</code> is - * already registered with this <code>ImageProducer</code>. - */ - public synchronized boolean isConsumer(ImageConsumer ic) { - if (consumers.contains(ic)) - return true; - return false; - } - - /** - * Used to remove an <code>ImageConsumer</code> from the list of - * registered consumers for this <code>ImageProducer</code>. - */ - public synchronized void removeConsumer(ImageConsumer ic) { - consumers.removeElement(ic); - } - - /** - * Used to register an <code>ImageConsumer</code> with this - * <code>ImageProducer</code> and then immediately start - * reconstruction of the image data to be delivered to all - * registered consumers. - */ - public void startProduction(ImageConsumer ic) { - if (!(consumers.contains(ic))) { - consumers.addElement(ic); - } - + private boolean animated = false; + private boolean fullbuffers = false; + private int[] pixeli; + private int width; + private int height; + private int offset; + private int scansize; + private byte[] pixelb; + private ColorModel cm; + private Hashtable props = new Hashtable(); + private Vector consumers = new Vector(); + + /** + * Construct an image producer that reads image data from a byte + * array. + * + * @param w width of image + * @param h height of image + * @param cm the color model used to represent pixel values + * @param pix a byte array of pixel values + * @param off the offset into the array at which the first pixel is stored + * @param scan the number of array elements that represents a single pixel row + */ + public MemoryImageSource(int w, int h, ColorModel cm, byte[] pix, int off, + int scan) + { + this(w, h, cm, pix, off, scan, null); + } + + /** + * Constructs an ImageProducer from memory + */ + public MemoryImageSource(int w, int h, ColorModel cm, byte[] pix, int off, + int scan, Hashtable props) + { + width = w; + height = h; + this.cm = cm; + offset = off; + scansize = scan; + this.props = props; + int max = ((scansize > width) ? scansize : width); + pixelb = pix; + } + + /** + * Construct an image producer that reads image data from an + * integer array. + * + * @param w width of image + * @param h height of image + * @param cm the color model used to represent pixel values + * @param pix an integer array of pixel values + * @param off the offset into the array at which the first pixel is stored + * @param scan the number of array elements that represents a single pixel row + */ + public MemoryImageSource(int w, int h, ColorModel cm, int[] pix, int off, + int scan) + { + this(w, h, cm, pix, off, scan, null); + } + + /** + Constructs an ImageProducer from memory + */ + public MemoryImageSource(int w, int h, ColorModel cm, int[] pix, int off, + int scan, Hashtable props) + { + width = w; + height = h; + this.cm = cm; + offset = off; + scansize = scan; + this.props = props; + int max = ((scansize > width) ? scansize : width); + pixeli = pix; + } + + /** + * Constructs an ImageProducer from memory using the default RGB ColorModel + */ + public MemoryImageSource(int w, int h, int[] pix, int off, int scan, + Hashtable props) + { + this(w, h, ColorModel.getRGBdefault(), pix, off, scan, props); + } + + /** + * Constructs an ImageProducer from memory using the default RGB ColorModel + */ + public MemoryImageSource(int w, int h, int[] pix, int off, int scan) + { + this(w, h, ColorModel.getRGBdefault(), pix, off, scan, null); + } + + /** + * Used to register an <code>ImageConsumer</code> with this + * <code>ImageProducer</code>. + */ + public synchronized void addConsumer(ImageConsumer ic) + { + if (consumers.contains(ic)) + return; + + consumers.addElement(ic); + } + + /** + * Used to determine if the given <code>ImageConsumer</code> is + * already registered with this <code>ImageProducer</code>. + */ + public synchronized boolean isConsumer(ImageConsumer ic) + { + if (consumers.contains(ic)) + return true; + return false; + } + + /** + * Used to remove an <code>ImageConsumer</code> from the list of + * registered consumers for this <code>ImageProducer</code>. + */ + public synchronized void removeConsumer(ImageConsumer ic) + { + consumers.removeElement(ic); + } + + /** + * Used to register an <code>ImageConsumer</code> with this + * <code>ImageProducer</code> and then immediately start + * reconstruction of the image data to be delivered to all + * registered consumers. + */ + public void startProduction(ImageConsumer ic) + { + if (! (consumers.contains(ic))) + consumers.addElement(ic); + + Vector list = (Vector) consumers.clone(); + for (int i = 0; i < list.size(); i++) + { + ic = (ImageConsumer) list.elementAt(i); + sendPicture(ic); + if (animated) + ic.imageComplete(ImageConsumer.SINGLEFRAME); + else + ic.imageComplete(ImageConsumer.STATICIMAGEDONE); + } + } + + /** + * Used to register an <code>ImageConsumer</code> with this + * <code>ImageProducer</code> and then request that this producer + * resend the image data in the order top-down, left-right. + */ + public void requestTopDownLeftRightResend(ImageConsumer ic) + { + startProduction(ic); + } + + /** + * Changes a flag to indicate whether this MemoryImageSource supports + * animations. + * + * @param animated A flag indicating whether this class supports animations + */ + public synchronized void setAnimated(boolean animated) + { + this.animated = animated; + } + + /** + * A flag to indicate whether or not to send full buffer updates when + * sending animation. If this flag is set then full buffers are sent + * in the newPixels methods instead of just regions. + * + * @param fullbuffers - a flag indicating whether to send the full buffers + */ + public synchronized void setFullBufferUpdates(boolean fullbuffers) + { + this.fullbuffers = fullbuffers; + } + + /** + * Send an animation frame to the image consumers. + */ + public void newPixels() + { + if (animated == true) + { + ImageConsumer ic; Vector list = (Vector) consumers.clone(); - for(int i = 0; i < list.size(); i++) { + for (int i = 0; i < list.size(); i++) + { ic = (ImageConsumer) list.elementAt(i); - sendPicture( ic ); - if (animated) - ic.imageComplete( ImageConsumer.SINGLEFRAME ); - else - ic.imageComplete( ImageConsumer.STATICIMAGEDONE ); - } - } - - /** - * Used to register an <code>ImageConsumer</code> with this - * <code>ImageProducer</code> and then request that this producer - * resend the image data in the order top-down, left-right. - */ - public void requestTopDownLeftRightResend(ImageConsumer ic) { - startProduction ( ic ); - } - - - /** - Changes a flag to indicate whether this MemoryImageSource supports - animations. - - @param animated A flag indicating whether this class supports animations - */ - public synchronized void setAnimated(boolean animated) - { - this.animated = animated; - } - - - /** - A flag to indicate whether or not to send full buffer updates when - sending animation. If this flag is set then full buffers are sent - in the newPixels methods instead of just regions. - - @param fullbuffers - a flag indicating whether to send the full buffers - */ - public synchronized void setFullBufferUpdates(boolean fullbuffers) - { - this.fullbuffers = fullbuffers; - } - - /** - Send an animation frame to the image consumers. - */ - public void newPixels() - { - if( animated == true ) { - ImageConsumer ic; - Vector list = (Vector) consumers.clone(); - for(int i = 0; i < list.size(); i++) { - ic = (ImageConsumer) list.elementAt(i); - sendPicture( ic ); - ic.imageComplete( ImageConsumer.SINGLEFRAME ); - } - } - } - - - private void sendPicture ( ImageConsumer ic ) - { - ic.setHints( ImageConsumer.TOPDOWNLEFTRIGHT ); - if( props != null ) { - ic.setProperties( props ); - } - ic.setDimensions(width, height); - ic.setColorModel(cm); - if( pixeli != null ) { - ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize ); - } else { - ic.setPixels( 0, 0, width, height, cm, pixelb, offset, scansize ); - } - } - - /** - Send an animation frame to the image consumers containing the specified - pixels unless setFullBufferUpdates is set. - */ - public synchronized void newPixels(int x, - int y, - int w, - int h) - { - if( animated == true ) - { - if( fullbuffers ) { - newPixels(); - } else { - ImageConsumer ic; - Vector list = (Vector) consumers.clone(); - for(int i = 0; i < list.size(); i++) { - ic = (ImageConsumer) list.elementAt(i); - ic.setHints( ImageConsumer.TOPDOWNLEFTRIGHT ); - if( props != null ) { - ic.setProperties( props ); - } - if( pixeli != null ) { - int[] pixelbuf = new int[w * h]; - for (int row = y; row < y + h; row++) - System.arraycopy(pixeli, row * scansize + x + offset, pixelbuf, 0, w * h); - ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); - } else { - byte[] pixelbuf = new byte[w * h]; - for (int row = y; row < y + h; row++) - System.arraycopy(pixelb, row * scansize + x + offset, pixelbuf, 0, w * h); - - ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); - } - ic.imageComplete( ImageConsumer.SINGLEFRAME ); - } - } - } - } - - - - /** - Send an animation frame to the image consumers containing the specified - pixels unless setFullBufferUpdates is set. - - If framenotify is set then a notification is sent when the frame - is sent otherwise no status is sent. - */ - public synchronized void newPixels(int x, - int y, - int w, - int h, - boolean framenotify) - { - if( animated == true ) - { - if( fullbuffers ) { - newPixels(); - } else { - ImageConsumer ic; - Vector list = (Vector) consumers.clone(); - for(int i = 0; i < list.size(); i++) { - ic = (ImageConsumer) list.elementAt(i); - ic.setHints( ImageConsumer.TOPDOWNLEFTRIGHT ); - if( props != null ) { - ic.setProperties( props ); - } - if( pixeli != null ) { - int[] pixelbuf = new int[w * h]; - for (int row = y; row < y + h; row++) - System.arraycopy(pixeli, row * scansize + x + offset, pixelbuf, 0, w * h); - ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); - } else { - byte[] pixelbuf = new byte[w * h]; - for (int row = y; row < y + h; row++) - System.arraycopy(pixelb, row * scansize + x + offset, pixelbuf, 0, w * h); - ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); - } - if( framenotify == true ) - ic.imageComplete( ImageConsumer.SINGLEFRAME ); - } - } - } - } - - public synchronized void newPixels(byte newpix[], - ColorModel newmodel, - int offset, - int scansize) - - { - pixeli = null; - pixelb = newpix; - cm = newmodel; - this.offset = offset; - this.scansize = scansize; - if( animated == true ) - { - newPixels(); - } - } - - public synchronized void newPixels(int newpix[], - ColorModel newmodel, - int offset, - int scansize) - - { - pixelb = null; - pixeli = newpix; - cm = newmodel; - this.offset = offset; - this.scansize = scansize; - if( animated == true ) - { - newPixels(); - } - } - + sendPicture(ic); + ic.imageComplete(ImageConsumer.SINGLEFRAME); + } + } + } + + private void sendPicture(ImageConsumer ic) + { + ic.setHints(ImageConsumer.TOPDOWNLEFTRIGHT); + if (props != null) + ic.setProperties(props); + ic.setDimensions(width, height); + ic.setColorModel(cm); + if (pixeli != null) + ic.setPixels(0, 0, width, height, cm, pixeli, offset, scansize); + else + ic.setPixels(0, 0, width, height, cm, pixelb, offset, scansize); + } + + /** + * Send an animation frame to the image consumers containing the specified + * pixels unless setFullBufferUpdates is set. + */ + public synchronized void newPixels(int x, int y, int w, int h) + { + if (animated == true) + { + if (fullbuffers) + newPixels(); + else + { + ImageConsumer ic; + Vector list = (Vector) consumers.clone(); + for (int i = 0; i < list.size(); i++) + { + ic = (ImageConsumer) list.elementAt(i); + ic.setHints(ImageConsumer.TOPDOWNLEFTRIGHT); + if (props != null) + ic.setProperties(props); + if (pixeli != null) + { + int[] pixelbuf = new int[w * h]; + for (int row = y; row < y + h; row++) + System.arraycopy(pixeli, row * scansize + x + offset, + pixelbuf, 0, w * h); + ic.setPixels(x, y, w, h, cm, pixelbuf, 0, w); + } + else + { + byte[] pixelbuf = new byte[w * h]; + for (int row = y; row < y + h; row++) + System.arraycopy(pixelb, row * scansize + x + offset, + pixelbuf, 0, w * h); + + ic.setPixels(x, y, w, h, cm, pixelbuf, 0, w); + } + ic.imageComplete(ImageConsumer.SINGLEFRAME); + } + } + } + } + + /** + * Send an animation frame to the image consumers containing the specified + * pixels unless setFullBufferUpdates is set. + * + * If framenotify is set then a notification is sent when the frame + * is sent otherwise no status is sent. + */ + public synchronized void newPixels(int x, int y, int w, int h, + boolean framenotify) + { + if (animated == true) + { + if (fullbuffers) + newPixels(); + else + { + ImageConsumer ic; + Vector list = (Vector) consumers.clone(); + for (int i = 0; i < list.size(); i++) + { + ic = (ImageConsumer) list.elementAt(i); + ic.setHints(ImageConsumer.TOPDOWNLEFTRIGHT); + if (props != null) + ic.setProperties(props); + if (pixeli != null) + { + int[] pixelbuf = new int[w * h]; + for (int row = y; row < y + h; row++) + System.arraycopy(pixeli, row * scansize + x + offset, + pixelbuf, 0, w * h); + ic.setPixels(x, y, w, h, cm, pixelbuf, 0, w); + } + else + { + byte[] pixelbuf = new byte[w * h]; + for (int row = y; row < y + h; row++) + System.arraycopy(pixelb, row * scansize + x + offset, + pixelbuf, 0, w * h); + ic.setPixels(x, y, w, h, cm, pixelbuf, 0, w); + } + if (framenotify == true) + ic.imageComplete(ImageConsumer.SINGLEFRAME); + } + } + } + } + + public synchronized void newPixels(byte[] newpix, ColorModel newmodel, + int offset, int scansize) + { + pixeli = null; + pixelb = newpix; + cm = newmodel; + this.offset = offset; + this.scansize = scansize; + if (animated == true) + newPixels(); + } + + public synchronized void newPixels(int[] newpix, ColorModel newmodel, + int offset, int scansize) + { + pixelb = null; + pixeli = newpix; + cm = newmodel; + this.offset = offset; + this.scansize = scansize; + if (animated == true) + newPixels(); + } } diff --git a/libjava/java/awt/image/MultiPixelPackedSampleModel.java b/libjava/java/awt/image/MultiPixelPackedSampleModel.java index 0525d37..6d5f284 100644 --- a/libjava/java/awt/image/MultiPixelPackedSampleModel.java +++ b/libjava/java/awt/image/MultiPixelPackedSampleModel.java @@ -59,7 +59,7 @@ public class MultiPixelPackedSampleModel extends SampleModel public MultiPixelPackedSampleModel(int dataType, int w, int h, int numberOfBits) { - this(dataType, w, h, 0, numberOfBits, 0); + this(dataType, w, h, numberOfBits, 0, 0); } public MultiPixelPackedSampleModel(int dataType, int w, int h, @@ -101,7 +101,7 @@ public class MultiPixelPackedSampleModel extends SampleModel // Compute scan line large enough for w pixels. if (scanlineStride == 0) - scanlineStride = ((dataBitOffset + w * numberOfBits) / elemBits) + 1; + scanlineStride = ((dataBitOffset + w * numberOfBits) / elemBits); this.scanlineStride = scanlineStride; @@ -112,8 +112,9 @@ public class MultiPixelPackedSampleModel extends SampleModel bitOffsets = new int[numElems]; for (int i=0; i < numElems; i++) { - bitOffsets[i] = numberOfBits * i; - bitMasks[i] = ((1 << numberOfBits) - 1) << bitOffsets[i]; + bitOffsets[numElems - i- 1] = numberOfBits * i; + bitMasks[numElems - i - 1] = ((1 << numberOfBits) - 1) << + bitOffsets[numElems - i - 1]; } } diff --git a/libjava/java/awt/image/RGBImageFilter.java b/libjava/java/awt/image/RGBImageFilter.java index 0fd977e..b613c1b 100644 --- a/libjava/java/awt/image/RGBImageFilter.java +++ b/libjava/java/awt/image/RGBImageFilter.java @@ -83,7 +83,7 @@ public abstract class RGBImageFilter extends ImageFilter } else { consumer.setColorModel(ColorModel.getRGBdefault()); - } + } } /** diff --git a/libjava/java/awt/image/ReplicateScaleFilter.java b/libjava/java/awt/image/ReplicateScaleFilter.java index a572da7..091909d 100644 --- a/libjava/java/awt/image/ReplicateScaleFilter.java +++ b/libjava/java/awt/image/ReplicateScaleFilter.java @@ -201,10 +201,10 @@ public class ReplicateScaleFilter extends ImageFilter model, destPixels, 0, destScansize); } - protected byte[] replicatePixels(int srcx, int srcy, int srcw, int srch, - ColorModel model, byte[] srcPixels, - int srcOffset, int srcScansize, - double rx, double ry, int destScansize) + private byte[] replicatePixels(int srcx, int srcy, int srcw, int srch, + ColorModel model, byte[] srcPixels, + int srcOffset, int srcScansize, + double rx, double ry, int destScansize) { byte[] destPixels = new byte[(int) Math.ceil(srcw/rx) * (int) Math.ceil(srch/ry)]; @@ -221,10 +221,10 @@ public class ReplicateScaleFilter extends ImageFilter return destPixels; } - protected int[] replicatePixels(int srcx, int srcy, int srcw, int srch, - ColorModel model, int[] srcPixels, - int srcOffset, int srcScansize, - double rx, double ry, int destScansize) + private int[] replicatePixels(int srcx, int srcy, int srcw, int srch, + ColorModel model, int[] srcPixels, + int srcOffset, int srcScansize, + double rx, double ry, int destScansize) { int[] destPixels = new int[(int) Math.ceil(srcw/rx) * (int) Math.ceil(srch/ry)]; diff --git a/libjava/java/awt/peer/RobotPeer.java b/libjava/java/awt/peer/RobotPeer.java index 2daa14d..a187fc0 100644 --- a/libjava/java/awt/peer/RobotPeer.java +++ b/libjava/java/awt/peer/RobotPeer.java @@ -43,12 +43,12 @@ import java.awt.Rectangle; public interface RobotPeer { void mouseMove (int x, int y); - void mousePress (int x); - void mouseRelease (int x); - void mouseWheel (int x); - void keyPress (int x); - void keyRelease (int x); + void mousePress (int buttons); + void mouseRelease (int buttons); + void mouseWheel (int wheelAmt); + void keyPress (int keycode); + void keyRelease (int keycode); int getRGBPixel (int x, int y); - int[] getRGBPixels (Rectangle r); + int[] getRGBPixels (Rectangle screen); } // interface RobotPeer diff --git a/libjava/java/awt/print/Book.java b/libjava/java/awt/print/Book.java index 9bdd7d6..41f360b 100644 --- a/libjava/java/awt/print/Book.java +++ b/libjava/java/awt/print/Book.java @@ -1,5 +1,5 @@ /* Book.java -- A mixed group of pages to print. - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 1999, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -41,146 +41,119 @@ package java.awt.print; import java.util.Vector; /** - * This class allows documents to be created with different paper types, - * page formatters, and painters. - * - * @author Aaron M. Renn (arenn@urbanophile.com) - */ -public class Book implements Pageable -{ - -/* - * Instance Variables - */ - -// Painter objects for the book -Vector printables = new Vector(); - -// Page formats for the book -Vector page_formats = new Vector(); - -/*************************************************************************/ - -/* - * Constructors + * This class allows documents to be created with different paper types, + * page formatters, and painters. + * + * @author Aaron M. Renn (arenn@urbanophile.com) */ - -/** - * Initializes a new instance of <code>Book</code> that is empty. - */ -public -Book() -{ - ; -} - -/*************************************************************************/ - -/** - * Returns the number of pages in this book. - * - * @return The number of pages in this book. - */ -public int -getNumberOfPages() -{ - return(printables.size()); -} - -/*************************************************************************/ - -/** - * This method returns the <code>PageFormat</code> object for the - * specified page. - * - * @param page_number The number of the page to get information for, where - * page numbers start at 0. - * - * @return The <code>PageFormat</code> object for the specified page. - * - * @exception IndexOutOfBoundsException If the page number is not valid. - */ -public PageFormat -getPageFormat(int page_number) -{ - return((PageFormat)page_formats.elementAt(page_number)); -} - -/*************************************************************************/ - -/** - * This method returns the <code>Printable</code> object for the - * specified page. - * - * @param page_number The number of the page to get information for, where - * page numbers start at 0. - * - * @return The <code>Printable</code> object for the specified page. - * - * @exception IndexOutOfBoundsException If the page number is not valid. - */ -public Printable -getPrintable(int page_number) -{ - return((Printable)printables.elementAt(page_number)); -} - -/*************************************************************************/ - -/** - * This method appends a page to the end of the book. - * - * @param printable The <code>Printable</code> for this page. - * @param page_format The <code>PageFormat</code> for this page. - * - * @exception NullPointerException If either argument is <code>null</code>. - */ -public void -append(Printable printable, PageFormat page_format) -{ - append(printable, page_format, 1); -} - -/*************************************************************************/ - -/** - * This method appends the specified number of pages to the end of the book. - * Each one will be associated with the specified <code>Printable</code> - * and <code>PageFormat</code>. - * - * @param printable The <code>Printable</code> for this page. - * @param page_format The <code>PageFormat</code> for this page. - * @param num_pages The number of pages to append. - * - * @exception NullPointerException If any argument is <code>null</code>. - */ -public void -append(Printable printable, PageFormat page_format, int num_pages) -{ - for (int i = 0; i < num_pages; i++) - { - printables.addElement(printable); - page_formats.addElement(page_format); - } -} - -/*************************************************************************/ - -/** - * This method changes the <code>Printable</code> and <code>PageFormat</code> - * for the specified page. The page must already exist or an exception - * will be thrown. - * - * @param page_num The page number to alter. - * @param printable The new <code>Printable</code> for the page. - * @param page_format The new <code>PageFormat</code> for the page. - * - * @throws IndexOutOfBoundsException If the specified page does not exist. - */ -public void -setPage(int page_num, Printable printable, PageFormat page_format) +public class Book implements Pageable { - printables.setElementAt(printable, page_num); - page_formats.setElementAt(page_format, page_num); -} + /** + * Painter objects for the book. + */ + Vector printables = new Vector(); + + /** + * Page formats for the book. + */ + Vector page_formats = new Vector(); + + /** + * Initializes a new instance of <code>Book</code> that is empty. + */ + public Book() + { + } + + /** + * Returns the number of pages in this book. + * + * @return The number of pages in this book. + */ + public int getNumberOfPages() + { + return printables.size(); + } + + /** + * This method returns the <code>PageFormat</code> object for the + * specified page. + * + * @param page_number The number of the page to get information for, where + * page numbers start at 0. + * + * @return The <code>PageFormat</code> object for the specified page. + * + * @exception IndexOutOfBoundsException If the page number is not valid. + */ + public PageFormat getPageFormat(int page_number) + { + return (PageFormat) page_formats.elementAt(page_number); + } + + /** + * This method returns the <code>Printable</code> object for the + * specified page. + * + * @param page_number The number of the page to get information for, where + * page numbers start at 0. + * + * @return The <code>Printable</code> object for the specified page. + * + * @exception IndexOutOfBoundsException If the page number is not valid. + */ + public Printable getPrintable(int page_number) + { + return (Printable) printables.elementAt(page_number); + } + + /** + * This method appends a page to the end of the book. + * + * @param printable The <code>Printable</code> for this page. + * @param page_format The <code>PageFormat</code> for this page. + * + * @exception NullPointerException If either argument is <code>null</code>. + */ + public void append(Printable printable, PageFormat page_format) + { + append(printable, page_format, 1); + } + + /** + * This method appends the specified number of pages to the end of the book. + * Each one will be associated with the specified <code>Printable</code> + * and <code>PageFormat</code>. + * + * @param printable The <code>Printable</code> for this page. + * @param page_format The <code>PageFormat</code> for this page. + * @param num_pages The number of pages to append. + * + * @exception NullPointerException If any argument is <code>null</code>. + */ + public void append(Printable printable, PageFormat page_format, int num_pages) + { + for (int i = 0; i < num_pages; i++) + { + printables.addElement(printable); + page_formats.addElement(page_format); + } + } + + /** + * This method changes the <code>Printable</code> and <code>PageFormat</code> + * for the specified page. The page must already exist or an exception + * will be thrown. + * + * @param page_num The page number to alter. + * @param printable The new <code>Printable</code> for the page. + * @param page_format The new <code>PageFormat</code> for the page. + * + * @throws IndexOutOfBoundsException If the specified page does not exist. + */ + public void setPage(int page_num, Printable printable, PageFormat page_format) + { + printables.setElementAt(printable, page_num); + page_formats.setElementAt(page_format, page_num); + } } diff --git a/libjava/java/awt/print/PrinterJob.java b/libjava/java/awt/print/PrinterJob.java index 8998aa0..bc5cfcd 100644 --- a/libjava/java/awt/print/PrinterJob.java +++ b/libjava/java/awt/print/PrinterJob.java @@ -1,5 +1,5 @@ /* PrinterJob.java -- This job is the printer control class - Copyright (C) 1999, 2004 Free Software Foundation, Inc. + Copyright (C) 1999, 2004, 2005 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,10 +38,9 @@ exception statement from your version. */ package java.awt.print; -import javax.print.DocFlavor; +import java.awt.HeadlessException; + import javax.print.PrintService; -import javax.print.PrintServiceLookup; -//import javax.print.StreamPrintServiceFactory; import javax.print.attribute.PrintRequestAttributeSet; /** @@ -61,7 +60,7 @@ public abstract class PrinterJob */ public static PrinterJob getPrinterJob() { - // FIXME: Need to fix this to load a default implementation instance. + // FIXME: Need to fix this to load a default implementation instance. return null; } @@ -149,7 +148,8 @@ public abstract class PrinterJob * * @return The modified <code>PageFormat</code>. */ - public abstract PageFormat pageDialog(PageFormat page_format); + public abstract PageFormat pageDialog(PageFormat page_format) + throws HeadlessException; /** * Prints the pages. @@ -169,7 +169,8 @@ public abstract class PrinterJob * @return <code>false</code> if the user cancels the dialog box, * <code>true</code> otherwise. */ - public abstract boolean printDialog(); + public abstract boolean printDialog() + throws HeadlessException; /** * Displays a dialog box to the user which allows the print job @@ -178,7 +179,8 @@ public abstract class PrinterJob * @return <code>false</code> if the user cancels the dialog box, * <code>true</code> otherwise. */ - public abstract boolean printDialog(PrintRequestAttributeSet attributes); + public abstract boolean printDialog(PrintRequestAttributeSet attributes) + throws HeadlessException; /** * This sets the pages that are to be printed. |