diff options
Diffstat (limited to 'awt/java/awt/Component.java')
-rw-r--r-- | awt/java/awt/Component.java | 6408 |
1 files changed, 6408 insertions, 0 deletions
diff --git a/awt/java/awt/Component.java b/awt/java/awt/Component.java new file mode 100644 index 000000000000..f19d2857e05a --- /dev/null +++ b/awt/java/awt/Component.java @@ -0,0 +1,6408 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package java.awt; + +//import java.awt.dnd.DropTarget; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; +import java.awt.event.HierarchyBoundsListener; +import java.awt.event.HierarchyEvent; +import java.awt.event.HierarchyListener; +import java.awt.event.InputMethodEvent; +import java.awt.event.InputMethodListener; +import java.awt.event.InvocationEvent; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; +import java.awt.event.PaintEvent; +import java.awt.event.WindowEvent; +import java.awt.im.InputContext; +import java.awt.im.InputMethodRequests; +import java.awt.image.BufferStrategy; +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.ImageObserver; +import java.awt.image.ImageProducer; +import java.awt.image.VolatileImage; +import java.awt.image.WritableRaster; +import java.awt.peer.ComponentPeer; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.Serializable; +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.ArrayList; +import java.util.Collection; +import java.util.EventListener; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +//???AWT +//import javax.accessibility.Accessible; +//import javax.accessibility.AccessibleComponent; +//import javax.accessibility.AccessibleContext; +//import javax.accessibility.AccessibleRole; +//import javax.accessibility.AccessibleState; +//import javax.accessibility.AccessibleStateSet; + +import org.apache.harmony.awt.ClipRegion; +//import org.apache.harmony.awt.FieldsAccessor; +import org.apache.harmony.awt.gl.MultiRectArea; +import org.apache.harmony.awt.internal.nls.Messages; +import org.apache.harmony.awt.state.State; +//import org.apache.harmony.awt.text.TextFieldKit; +//import org.apache.harmony.awt.text.TextKit; +import org.apache.harmony.awt.wtk.NativeWindow; + +/** + * The abstract Component class specifies an object with a graphical + * representation that can be displayed on the screen and that can + * interact with the user (for example: scrollbars, buttons, checkboxes). + */ +public abstract class Component implements ImageObserver, MenuContainer, Serializable { + + /** The Constant serialVersionUID. */ + private static final long serialVersionUID = -7644114512714619750L; + + /** The Constant TOP_ALIGNMENT indicates the top alignment of the component. */ + public static final float TOP_ALIGNMENT = 0.0f; + + /** The Constant CENTER_ALIGNMENT indicates the center alignment of the component. */ + public static final float CENTER_ALIGNMENT = 0.5f; + + /** The Constant BOTTOM_ALIGNMENT indicates the bottom alignment of the component. */ + public static final float BOTTOM_ALIGNMENT = 1.0f; + + /** The Constant LEFT_ALIGNMENT indicates the left alignment of the component. */ + public static final float LEFT_ALIGNMENT = 0.0f; + + /** The Constant RIGHT_ALIGNMENT indicates the right alignment of the component. */ + public static final float RIGHT_ALIGNMENT = 1.0f; + + /** The Constant childClassesFlags. */ + private static final Hashtable<Class<?>, Boolean> childClassesFlags = new Hashtable<Class<?>, Boolean>(); + + /** The Constant peer. */ + private static final ComponentPeer peer = new ComponentPeer() { + }; + + /** The Constant incrementalImageUpdate. */ + private static final boolean incrementalImageUpdate; + + /** The toolkit. */ + final transient Toolkit toolkit = Toolkit.getDefaultToolkit(); + + //???AWT + /* + protected abstract class AccessibleAWTComponent extends AccessibleContext implements + Serializable, AccessibleComponent { + private static final long serialVersionUID = 642321655757800191L; + + protected class AccessibleAWTComponentHandler implements ComponentListener { + protected AccessibleAWTComponentHandler() { + } + + public void componentHidden(ComponentEvent e) { + if (behaviour.isLightweight()) { + return; + } + firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + AccessibleState.VISIBLE, null); + } + + public void componentMoved(ComponentEvent e) { + } + + public void componentResized(ComponentEvent e) { + } + + public void componentShown(ComponentEvent e) { + if (behaviour.isLightweight()) { + return; + } + firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY, null, + AccessibleState.VISIBLE); + } + } + + protected class AccessibleAWTFocusHandler implements FocusListener { + public void focusGained(FocusEvent e) { + if (behaviour.isLightweight()) { + return; + } + firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY, null, + AccessibleState.FOCUSED); + } + + public void focusLost(FocusEvent e) { + if (behaviour.isLightweight()) { + return; + } + firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + AccessibleState.FOCUSED, null); + } + } + + protected ComponentListener accessibleAWTComponentHandler; + + protected FocusListener accessibleAWTFocusHandler; + */ + /* + * Number of registered property change listeners. + */ + /* + int listenersCount; + + public void addFocusListener(FocusListener l) { + Component.this.addFocusListener(l); + } + + @Override + public void addPropertyChangeListener(PropertyChangeListener listener) { + toolkit.lockAWT(); + try { + super.addPropertyChangeListener(listener); + listenersCount++; + if (accessibleAWTComponentHandler == null) { + accessibleAWTComponentHandler = new AccessibleAWTComponentHandler(); + Component.this.addComponentListener(accessibleAWTComponentHandler); + } + if (accessibleAWTFocusHandler == null) { + accessibleAWTFocusHandler = new AccessibleAWTFocusHandler(); + Component.this.addFocusListener(accessibleAWTFocusHandler); + } + } finally { + toolkit.unlockAWT(); + } + } + + public boolean contains(Point p) { + toolkit.lockAWT(); + try { + return Component.this.contains(p); + } finally { + toolkit.unlockAWT(); + } + } + + public Accessible getAccessibleAt(Point arg0) { + toolkit.lockAWT(); + try { + return null; + } finally { + toolkit.unlockAWT(); + } + } + + public Color getBackground() { + toolkit.lockAWT(); + try { + return Component.this.getBackground(); + } finally { + toolkit.unlockAWT(); + } + } + + public Rectangle getBounds() { + toolkit.lockAWT(); + try { + return Component.this.getBounds(); + } finally { + toolkit.unlockAWT(); + } + } + + public Cursor getCursor() { + toolkit.lockAWT(); + try { + return Component.this.getCursor(); + } finally { + toolkit.unlockAWT(); + } + } + + public Font getFont() { + toolkit.lockAWT(); + try { + return Component.this.getFont(); + } finally { + toolkit.unlockAWT(); + } + } + + public FontMetrics getFontMetrics(Font f) { + toolkit.lockAWT(); + try { + return Component.this.getFontMetrics(f); + } finally { + toolkit.unlockAWT(); + } + } + + public Color getForeground() { + toolkit.lockAWT(); + try { + return Component.this.getForeground(); + } finally { + toolkit.unlockAWT(); + } + } + + public Point getLocation() { + toolkit.lockAWT(); + try { + return Component.this.getLocation(); + } finally { + toolkit.unlockAWT(); + } + } + + public Point getLocationOnScreen() { + toolkit.lockAWT(); + try { + return Component.this.getLocationOnScreen(); + } finally { + toolkit.unlockAWT(); + } + } + + public Dimension getSize() { + toolkit.lockAWT(); + try { + return Component.this.getSize(); + } finally { + toolkit.unlockAWT(); + } + } + + public boolean isEnabled() { + toolkit.lockAWT(); + try { + return Component.this.isEnabled(); + } finally { + toolkit.unlockAWT(); + } + } + + public boolean isFocusTraversable() { + toolkit.lockAWT(); + try { + return Component.this.isFocusTraversable(); + } finally { + toolkit.unlockAWT(); + } + } + + public boolean isShowing() { + toolkit.lockAWT(); + try { + return Component.this.isShowing(); + } finally { + toolkit.unlockAWT(); + } + } + + public boolean isVisible() { + toolkit.lockAWT(); + try { + return Component.this.isVisible(); + } finally { + toolkit.unlockAWT(); + } + } + + public void removeFocusListener(FocusListener l) { + Component.this.removeFocusListener(l); + } + + @Override + public void removePropertyChangeListener(PropertyChangeListener listener) { + toolkit.lockAWT(); + try { + super.removePropertyChangeListener(listener); + listenersCount--; + if (listenersCount > 0) { + return; + } + // if there are no more listeners, remove handlers: + Component.this.removeFocusListener(accessibleAWTFocusHandler); + Component.this.removeComponentListener(accessibleAWTComponentHandler); + accessibleAWTComponentHandler = null; + accessibleAWTFocusHandler = null; + } finally { + toolkit.unlockAWT(); + } + } + + public void requestFocus() { + toolkit.lockAWT(); + try { + Component.this.requestFocus(); + } finally { + toolkit.unlockAWT(); + } + } + + public void setBackground(Color color) { + toolkit.lockAWT(); + try { + Component.this.setBackground(color); + } finally { + toolkit.unlockAWT(); + } + } + + public void setBounds(Rectangle r) { + toolkit.lockAWT(); + try { + Component.this.setBounds(r); + } finally { + toolkit.unlockAWT(); + } + } + + public void setCursor(Cursor cursor) { + toolkit.lockAWT(); + try { + Component.this.setCursor(cursor); + } finally { + toolkit.unlockAWT(); + } + } + + public void setEnabled(boolean enabled) { + toolkit.lockAWT(); + try { + Component.this.setEnabled(enabled); + } finally { + toolkit.unlockAWT(); + } + } + + public void setFont(Font f) { + toolkit.lockAWT(); + try { + Component.this.setFont(f); + } finally { + toolkit.unlockAWT(); + } + } + + public void setForeground(Color color) { + toolkit.lockAWT(); + try { + Component.this.setForeground(color); + } finally { + toolkit.unlockAWT(); + } + } + + public void setLocation(Point p) { + toolkit.lockAWT(); + try { + Component.this.setLocation(p); + } finally { + toolkit.unlockAWT(); + } + } + + public void setSize(Dimension size) { + toolkit.lockAWT(); + try { + Component.this.setSize(size); + } finally { + toolkit.unlockAWT(); + } + } + + public void setVisible(boolean visible) { + toolkit.lockAWT(); + try { + Component.this.setVisible(visible); + } finally { + toolkit.unlockAWT(); + } + } + + @Override + public Accessible getAccessibleParent() { + toolkit.lockAWT(); + try { + Accessible aParent = super.getAccessibleParent(); + if (aParent != null) { + return aParent; + } + Container parent = getParent(); + return (parent instanceof Accessible ? (Accessible) parent : null); + } finally { + toolkit.unlockAWT(); + } + } + + @Override + public Accessible getAccessibleChild(int i) { + toolkit.lockAWT(); + try { + return null; + } finally { + toolkit.unlockAWT(); + } + } + + @Override + public int getAccessibleChildrenCount() { + toolkit.lockAWT(); + try { + return 0; + } finally { + toolkit.unlockAWT(); + } + } + + @Override + public AccessibleComponent getAccessibleComponent() { + return this; + } + + @Override + public String getAccessibleDescription() { + return super.getAccessibleDescription(); // why override? + } + + @Override + public int getAccessibleIndexInParent() { + toolkit.lockAWT(); + try { + if (getAccessibleParent() == null) { + return -1; + } + int count = 0; + Container parent = getParent(); + for (int i = 0; i < parent.getComponentCount(); i++) { + Component aComp = parent.getComponent(i); + if (aComp instanceof Accessible) { + if (aComp == Component.this) { + return count; + } + ++count; + } + } + return -1; + } finally { + toolkit.unlockAWT(); + } + } + + @Override + public AccessibleRole getAccessibleRole() { + toolkit.lockAWT(); + try { + return AccessibleRole.AWT_COMPONENT; + } finally { + toolkit.unlockAWT(); + } + } + + @Override + public AccessibleStateSet getAccessibleStateSet() { + toolkit.lockAWT(); + try { + AccessibleStateSet set = new AccessibleStateSet(); + if (isEnabled()) { + set.add(AccessibleState.ENABLED); + } + if (isFocusable()) { + set.add(AccessibleState.FOCUSABLE); + } + if (hasFocus()) { + set.add(AccessibleState.FOCUSED); + } + if (isOpaque()) { + set.add(AccessibleState.OPAQUE); + } + if (isShowing()) { + set.add(AccessibleState.SHOWING); + } + if (isVisible()) { + set.add(AccessibleState.VISIBLE); + } + return set; + } finally { + toolkit.unlockAWT(); + } + } + + @Override + public Locale getLocale() throws IllegalComponentStateException { + toolkit.lockAWT(); + try { + return Component.this.getLocale(); + } finally { + toolkit.unlockAWT(); + } + } + } + */ + /** + * The BltBufferStrategy class provides opportunity of blitting + * offscreen surfaces to a component. For more information on + * blitting, see <a href="http://en.wikipedia.org/wiki/Bit_blit">Bit blit</a>. + */ + protected class BltBufferStrategy extends BufferStrategy { + + /** The back buffers. */ + protected VolatileImage[] backBuffers; + + /** The caps. */ + protected BufferCapabilities caps; + + /** The width. */ + protected int width; + + /** The height. */ + protected int height; + + /** The validated contents. */ + protected boolean validatedContents; + + /** + * Instantiates a new BltBufferStrategy buffer strategy. + * + * @param numBuffers the number of buffers. + * @param caps the BufferCapabilities. + * + * @throws NotImplementedException the not implemented exception. + */ + protected BltBufferStrategy(int numBuffers, BufferCapabilities caps) throws org.apache.harmony.luni.util.NotImplementedException { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + } + + /** + * Returns true if the drawing buffer has been lost since the last call + * to getDrawGraphics. + * + * @return true if the drawing buffer has been lost since the last call + * to getDrawGraphics, false otherwise. + * + * @see java.awt.image.BufferStrategy#contentsLost() + */ + @Override + public boolean contentsLost() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + return false; + } + + /** + * Returns true if the drawing buffer has been restored from a lost + * state and reinitialized to the default background color. + * + * @return true if the drawing buffer has been restored from a lost + * state and reinitialized to the default background color, + * false otherwise. + * + * @see java.awt.image.BufferStrategy#contentsRestored() + */ + @Override + public boolean contentsRestored() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + return false; + } + + /** + * Creates the back buffers. + * + * @param numBuffers the number of buffers. + */ + protected void createBackBuffers(int numBuffers) { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + } + + /** + * Returns the BufferCapabilities of the buffer strategy. + * + * @return the BufferCapabilities. + * + * @see java.awt.image.BufferStrategy#getCapabilities() + */ + @Override + public BufferCapabilities getCapabilities() { + return (BufferCapabilities) caps.clone(); + } + + /** + * Gets Graphics of current buffer strategy. + * + * @return the Graphics of current buffer strategy. + * + * @see java.awt.image.BufferStrategy#getDrawGraphics() + */ + @Override + public Graphics getDrawGraphics() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + return null; + } + + /** + * Revalidates the lost drawing buffer. + */ + protected void revalidate() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + } + + /** + * Shows the next available buffer. + * + * @see java.awt.image.BufferStrategy#show() + */ + @Override + public void show() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + } + } + + /** + * The FlipBufferStrategy class is for flipping buffers on a component. + */ + protected class FlipBufferStrategy extends BufferStrategy { + + /** The Buffer Capabilities. */ + protected BufferCapabilities caps; + + /** The drawing buffer. */ + protected Image drawBuffer; + + /** The drawing VolatileImage buffer. */ + protected VolatileImage drawVBuffer; + + /** The number of buffers. */ + protected int numBuffers; + + /** The validated contents indicates if the drawing buffer is restored from + * lost state. */ + protected boolean validatedContents; + + /** + * Instantiates a new flip buffer strategy. + * + * @param numBuffers the number of buffers. + * @param caps the BufferCapabilities. + * + * @throws AWTException if the capabilities supplied could not + * be supported or met. + */ + protected FlipBufferStrategy(int numBuffers, BufferCapabilities caps) + throws AWTException { + //???AWT + /* + if (!(Component.this instanceof Window) && !(Component.this instanceof Canvas)) { + // awt.14B=Only Canvas or Window is allowed + throw new ClassCastException(Messages.getString("awt.14B")); //$NON-NLS-1$ + } + */ + // TODO: throw new AWTException("Capabilities are not supported"); + this.numBuffers = numBuffers; + this.caps = (BufferCapabilities) caps.clone(); + } + + /** + * Returns true if the drawing buffer has been lost since the last call + * to getDrawGraphics. + * + * @return true if the drawing buffer has been lost since the last call + * to getDrawGraphics, false otherwise. + * + * @see java.awt.image.BufferStrategy#contentsLost() + */ + @Override + public boolean contentsLost() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + return false; + } + + /** + * Returns true if the drawing buffer has been restored from a lost + * state and reinitialized to the default background color. + * + * @return true if the drawing buffer has been restored from a lost + * state and reinitialized to the default background color, + * false otherwise. + * + * @see java.awt.image.BufferStrategy#contentsRestored() + */ + @Override + public boolean contentsRestored() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + return false; + } + + /** + * Creates flipping buffers with the specified buffer capabilities. + * + * @param numBuffers the number of buffers. + * @param caps the BufferCapabilities. + * + * @throws AWTException if the capabilities could not be + * supported or met. + */ + protected void createBuffers(int numBuffers, BufferCapabilities caps) + throws AWTException { + if (numBuffers < 2) { + // awt.14C=Number of buffers must be greater than one + throw new IllegalArgumentException(Messages.getString("awt.14C")); //$NON-NLS-1$ + } + if (!caps.isPageFlipping()) { + // awt.14D=Buffer capabilities should support flipping + throw new IllegalArgumentException(Messages.getString("awt.14D")); //$NON-NLS-1$ + } + if (!Component.this.behaviour.isDisplayable()) { + // awt.14E=Component should be displayable + throw new IllegalStateException(Messages.getString("awt.14E")); //$NON-NLS-1$ + } + // TODO: throw new AWTException("Capabilities are not supported"); + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + } + + /** + * Destroy buffers. + */ + protected void destroyBuffers() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + } + + /** + * Flips the contents of the back buffer to the front buffer. + * + * @param flipAction the flip action. + */ + protected void flip(BufferCapabilities.FlipContents flipAction) { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + } + + /** + * Gets the back buffer as Image. + * + * @return the back buffer as Image. + */ + protected Image getBackBuffer() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + return null; + } + + /** + * Returns the BufferCapabilities of the buffer strategy. + * + * @return the BufferCapabilities. + * + * @see java.awt.image.BufferStrategy#getCapabilities() + */ + @Override + public BufferCapabilities getCapabilities() { + return (BufferCapabilities) caps.clone(); + } + + /** + * Gets Graphics of current buffer strategy. + * + * @return the Graphics of current buffer strategy. + * + * @see java.awt.image.BufferStrategy#getDrawGraphics() + */ + @Override + public Graphics getDrawGraphics() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + return null; + } + + /** + * Revalidates the lost drawing buffer. + */ + protected void revalidate() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + } + + /** + * Shows the next available buffer. + * + * @see java.awt.image.BufferStrategy#show() + */ + @Override + public void show() { + if (true) { + throw new RuntimeException("Method is not implemented"); //$NON-NLS-1$ + } + } + } + + /** + * The internal component's state utilized by the visual theme. + */ + class ComponentState implements State { + + /** The default minimum size. */ + private Dimension defaultMinimumSize = new Dimension(); + + /** + * Checks if the component is enabled. + * + * @return true, if the component is enabled + */ + public boolean isEnabled() { + return enabled; + } + + /** + * Checks if the component is visible. + * + * @return true, if the component is visible + */ + public boolean isVisible() { + return visible; + } + + /** + * Checks if is focused. + * + * @return true, if is focused + */ + public boolean isFocused() { + //???AWT: return isFocusOwner(); + return false; + } + + /** + * Gets the font. + * + * @return the font + */ + public Font getFont() { + return Component.this.getFont(); + } + + /** + * Checks if the font has been set. + * + * @return true, if the font has been set + */ + public boolean isFontSet() { + return font != null; + } + + /** + * Gets the background color. + * + * @return the background color + */ + public Color getBackground() { + Color c = Component.this.getBackground(); + return (c != null) ? c : getDefaultBackground(); + } + + /** + * Checks if the background is set. + * + * @return true, if the background is set + */ + public boolean isBackgroundSet() { + return backColor != null; + } + + /** + * Gets the text color. + * + * @return the text color + */ + public Color getTextColor() { + Color c = getForeground(); + return (c != null) ? c : getDefaultForeground(); + } + + /** + * Checks if the text color is set. + * + * @return true, if the text color is set + */ + public boolean isTextColorSet() { + return foreColor != null; + } + + /** + * Gets the font metrics. + * + * @return the font metrics + */ + @SuppressWarnings("deprecation") + public FontMetrics getFontMetrics() { + return toolkit.getFontMetrics(Component.this.getFont()); + } + + /** + * Gets the bounding rectangle. + * + * @return the bounding rectangle + */ + public Rectangle getBounds() { + return new Rectangle(x, y, w, h); + } + + /** + * Gets the size of the bounding rectangle. + * + * @return the size of the bounding rectangle + */ + public Dimension getSize() { + return new Dimension(w, h); + } + + /** + * Gets the window id. + * + * @return the window id + */ + public long getWindowId() { + NativeWindow win = getNativeWindow(); + return (win != null) ? win.getId() : 0; + } + + /** + * Gets the default minimum size. + * + * @return the default minimum size + */ + public Dimension getDefaultMinimumSize() { + if (defaultMinimumSize == null) { + calculate(); + } + return defaultMinimumSize; + } + + /** + * Sets the default minimum size. + * + * @param size the new default minimum size + */ + public void setDefaultMinimumSize(Dimension size) { + defaultMinimumSize = size; + } + + /** + * Reset the default minimum size to null. + */ + public void reset() { + defaultMinimumSize = null; + } + + /** + * Calculate the default minimum size: to be overridden. + */ + public void calculate() { + // to be overridden + } + } + + //???AWT: private transient AccessibleContext accessibleContext; + + /** The behaviour. */ + final transient ComponentBehavior behaviour; + + //???AWT: Container parent; + + /** The name. */ + private String name; + + /** The auto name. */ + private boolean autoName = true; + + /** The font. */ + private Font font; + + /** The back color. */ + private Color backColor; + + /** The fore color. */ + private Color foreColor; + + /** The deprecated event handler. */ + boolean deprecatedEventHandler = true; + + /** The enabled events. */ + private long enabledEvents; + + /** The enabled awt events. */ + private long enabledAWTEvents; + + /** The component listeners. */ + private final AWTListenerList<ComponentListener> componentListeners = new AWTListenerList<ComponentListener>( + this); + + /** The focus listeners. */ + private final AWTListenerList<FocusListener> focusListeners = new AWTListenerList<FocusListener>( + this); + + /** The hierarchy listeners. */ + private final AWTListenerList<HierarchyListener> hierarchyListeners = new AWTListenerList<HierarchyListener>( + this); + + /** The hierarchy bounds listeners. */ + private final AWTListenerList<HierarchyBoundsListener> hierarchyBoundsListeners = new AWTListenerList<HierarchyBoundsListener>( + this); + + /** The key listeners. */ + private final AWTListenerList<KeyListener> keyListeners = new AWTListenerList<KeyListener>( + this); + + /** The mouse listeners. */ + private final AWTListenerList<MouseListener> mouseListeners = new AWTListenerList<MouseListener>( + this); + + /** The mouse motion listeners. */ + private final AWTListenerList<MouseMotionListener> mouseMotionListeners = new AWTListenerList<MouseMotionListener>( + this); + + /** The mouse wheel listeners. */ + private final AWTListenerList<MouseWheelListener> mouseWheelListeners = new AWTListenerList<MouseWheelListener>( + this); + + /** The input method listeners. */ + private final AWTListenerList<InputMethodListener> inputMethodListeners = new AWTListenerList<InputMethodListener>( + this); + + /** The x. */ + int x; + + /** The y. */ + int y; + + /** The w. */ + int w; + + /** The h. */ + int h; + + /** The maximum size. */ + private Dimension maximumSize; + + /** The minimum size. */ + private Dimension minimumSize; + + /** The preferred size. */ + private Dimension preferredSize; + + /** The bounds mask param. */ + private int boundsMaskParam; + + /** The ignore repaint. */ + private boolean ignoreRepaint; + + /** The enabled. */ + private boolean enabled = true; + + /** The input methods enabled. */ + private boolean inputMethodsEnabled = true; + + /** The dispatch to im. */ + transient boolean dispatchToIM = true; + + /** The focusable. */ + private boolean focusable = true; // By default, all Components return + + // true from isFocusable() method + /** The visible. */ + boolean visible = true; + + /** The called set focusable. */ + private boolean calledSetFocusable; + + /** The overriden is focusable. */ + private boolean overridenIsFocusable = true; + + /** The focus traversal keys enabled. */ + private boolean focusTraversalKeysEnabled = true; + + /** Possible keys are: FORWARD_TRAVERSAL_KEYS, BACKWARD_TRAVERSAL_KEYS, UP_CYCLE_TRAVERSAL_KEYS. */ + private final Map<Integer, Set<? extends AWTKeyStroke>> traversalKeys = new HashMap<Integer, Set<? extends AWTKeyStroke>>(); + + /** The traversal i ds. */ + int[] traversalIDs; + + /** The locale. */ + private Locale locale; + + /** The orientation. */ + private ComponentOrientation orientation; + + /** The property change support. */ + private PropertyChangeSupport propertyChangeSupport; + + //???AWT: private ArrayList<PopupMenu> popups; + + /** The coalescer. */ + private boolean coalescer; + + /** The events table. */ + private Hashtable<Integer, LinkedList<AWTEvent>> eventsTable; + + /** Cashed reference used during EventQueue.postEvent() */ + private LinkedList<AWTEvent> eventsList; + + /** The hierarchy changing counter. */ + private int hierarchyChangingCounter; + + /** The was showing. */ + private boolean wasShowing; + + /** The was displayable. */ + private boolean wasDisplayable; + + /** The cursor. */ + Cursor cursor; + + //???AWT: DropTarget dropTarget; + + /** The mouse exited expected. */ + private boolean mouseExitedExpected; + + /** The repaint region. */ + transient MultiRectArea repaintRegion; + + //???AWT: transient RedrawManager redrawManager; + /** The redraw manager. */ + transient Object redrawManager; + + /** The valid. */ + private boolean valid; + + /** The updated images. */ + private HashMap<Image, ImageParameters> updatedImages; + + /** + * The lock object for private component's data which don't affect the + * component hierarchy. + */ + private class ComponentLock { + } + + /** The component lock. */ + private final transient Object componentLock = new ComponentLock(); + static { + PrivilegedAction<String[]> action = new PrivilegedAction<String[]>() { + public String[] run() { + String properties[] = new String[2]; + properties[0] = System.getProperty("awt.image.redrawrate", "100"); //$NON-NLS-1$ //$NON-NLS-2$ + properties[1] = System.getProperty("awt.image.incrementaldraw", "true"); //$NON-NLS-1$ //$NON-NLS-2$ + return properties; + } + }; + String properties[] = AccessController.doPrivileged(action); + // FIXME: rate is never used, can this code and the get property above + // be removed? + // int rate; + // + // try { + // rate = Integer.decode(properties[0]).intValue(); + // } catch (NumberFormatException e) { + // rate = 100; + // } + incrementalImageUpdate = properties[1].equals("true"); //$NON-NLS-1$ + } + + /** + * Instantiates a new component. + */ + protected Component() { + toolkit.lockAWT(); + try { + orientation = ComponentOrientation.UNKNOWN; + redrawManager = null; + //???AWT + /* + traversalIDs = this instanceof Container ? KeyboardFocusManager.contTraversalIDs + : KeyboardFocusManager.compTraversalIDs; + for (int element : traversalIDs) { + traversalKeys.put(new Integer(element), null); + } + behaviour = createBehavior(); + */ + behaviour = null; + + deriveCoalescerFlag(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Determine that the class inherited from Component declares the method + * coalesceEvents(), and put the results to the childClassesFlags map. + */ + private void deriveCoalescerFlag() { + Class<?> thisClass = getClass(); + boolean flag = true; + synchronized (childClassesFlags) { + Boolean flagWrapper = childClassesFlags.get(thisClass); + if (flagWrapper == null) { + Method coalesceMethod = null; + for (Class<?> c = thisClass; c != Component.class; c = c.getSuperclass()) { + try { + coalesceMethod = c.getDeclaredMethod("coalesceEvents", new Class[] { //$NON-NLS-1$ + Class.forName("java.awt.AWTEvent"), //$NON-NLS-1$ + Class.forName("java.awt.AWTEvent") }); //$NON-NLS-1$ + } catch (Exception e) { + } + if (coalesceMethod != null) { + break; + } + } + flag = (coalesceMethod != null); + childClassesFlags.put(thisClass, Boolean.valueOf(flag)); + } else { + flag = flagWrapper.booleanValue(); + } + } + coalescer = flag; + if (flag) { + eventsTable = new Hashtable<Integer, LinkedList<AWTEvent>>(); + } else { + eventsTable = null; + } + } + + /** + * Sets the name of the Component. + * + * @param name the new name of the Component. + */ + public void setName(String name) { + String oldName; + toolkit.lockAWT(); + try { + autoName = false; + oldName = this.name; + this.name = name; + } finally { + toolkit.unlockAWT(); + } + firePropertyChange("name", oldName, name); //$NON-NLS-1$ + } + + /** + * Gets the name of this Component. + * + * @return the name of this Component. + */ + public String getName() { + toolkit.lockAWT(); + try { + if ((name == null) && autoName) { + name = autoName(); + } + return name; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Auto name. + * + * @return the string + */ + String autoName() { + String name = getClass().getName(); + if (name.indexOf("$") != -1) { //$NON-NLS-1$ + return null; + } + //???AWT + //int number = toolkit.autoNumber.nextComponent++; + int number = 0; + name = name.substring(name.lastIndexOf(".") + 1) + Integer.toString(number); //$NON-NLS-1$ + return name; + } + + /** + * Returns the string representation of the Component. + * + * @return the string representation of the Component. + */ + @Override + public String toString() { + /* + * The format is based on 1.5 release behavior which can be revealed by + * the following code: + * + * Component c = new Component(){}; c.setVisible(false); + * System.out.println(c); + */ + toolkit.lockAWT(); + try { + return getClass().getName() + "[" + paramString() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ + } finally { + toolkit.unlockAWT(); + } + } + + //???AWT + /* + public void add(PopupMenu popup) { + toolkit.lockAWT(); + try { + if (popup.getParent() == this) { + return; + } + if (popups == null) { + popups = new ArrayList<PopupMenu>(); + } + popup.setParent(this); + popups.add(popup); + } finally { + toolkit.unlockAWT(); + } + } + */ + + /** + * Returns true, if the component contains the specified Point. + * + * @param p the Point. + * + * @return true, if the component contains the specified Point, + * false otherwise. + */ + public boolean contains(Point p) { + toolkit.lockAWT(); + try { + return contains(p.x, p.y); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Returns true, if the component contains the point with + * the specified coordinates. + * + * @param x the x coordinate. + * @param y the y coordinate. + * + * @return true, if the component contains the point with + * the specified coordinates, false otherwise. + */ + public boolean contains(int x, int y) { + toolkit.lockAWT(); + try { + return inside(x, y); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Deprecated: replaced by replaced by getSize() method. + * + * @return the dimension. + * + * @deprecated Replaced by getSize() method. + */ + @Deprecated + public Dimension size() { + toolkit.lockAWT(); + try { + return new Dimension(w, h); + } finally { + toolkit.unlockAWT(); + } + } + + //???AWT + /* + public Container getParent() { + toolkit.lockAWT(); + try { + return parent; + } finally { + toolkit.unlockAWT(); + } + } + */ + + /** + * List. + * + * @param out the out + * @param indent the indent + * + * @return the nearest heavyweight ancestor in hierarchy or + * <code>null</code> if not found + */ + //???AWT + /* + Component getHWAncestor() { + return (parent != null ? parent.getHWSurface() : null); + } + */ + + /** + * @return heavyweight component that is equal to or is a nearest + * heavyweight container of the current component, or + * <code>null</code> if not found + */ + //???AWT + /* + Component getHWSurface() { + Component parent; + for (parent = this; (parent != null) && (parent.isLightweight()); parent = parent + .getParent()) { + ; + } + return parent; + } + + Window getWindowAncestor() { + Component par; + for (par = this; par != null && !(par instanceof Window); par = par.getParent()) { + ; + } + return (Window) par; + } + */ + + /** To be called by container */ + //???AWT + /* + void setParent(Container parent) { + this.parent = parent; + setRedrawManager(); + } + + void setRedrawManager() { + redrawManager = getRedrawManager(); + } + + public void remove(MenuComponent menu) { + toolkit.lockAWT(); + try { + if (menu.getParent() == this) { + menu.setParent(null); + popups.remove(menu); + } + } finally { + toolkit.unlockAWT(); + } + } + */ + /** + * Prints a list of this component with the specified number of + * leading whitespace characters to the specified PrintStream. + * + * @param out the output PrintStream object. + * @param indent how many leading whitespace characters to prepend + */ + public void list(PrintStream out, int indent) { + toolkit.lockAWT(); + try { + out.println(getIndentStr(indent) + this); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Prints a list of this component to the specified PrintWriter. + * + * @param out the output PrintWriter object. + */ + public void list(PrintWriter out) { + toolkit.lockAWT(); + try { + list(out, 1); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Prints a list of this component with the specified number of + * leading whitespace characters to the specified PrintWriter. + * + * @param out the output PrintWriter object. + * @param indent how many leading whitespace characters to prepend + */ + public void list(PrintWriter out, int indent) { + toolkit.lockAWT(); + try { + out.println(getIndentStr(indent) + this); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets a string composed of the desired number of + * whitespace characters. + * + * @param indent the length of the String to return + * + * @return the string composed of the desired number of + * whitespace characters + */ + String getIndentStr(int indent) { + char[] ind = new char[indent]; + for (int i = 0; i < indent; ind[i++] = ' ') { + ; + } + return new String(ind); + } + + /** + * Prints a list of this component to the specified PrintStream + * + * @param out the output PrintStream object. + */ + public void list(PrintStream out) { + toolkit.lockAWT(); + try { + // default indent = 1 + list(out, 1); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Prints a list of this component to the standard system + * output stream. + */ + public void list() { + toolkit.lockAWT(); + try { + list(System.out); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Prints this component. + * + * @param g the Graphics to be used for painting. + */ + public void print(Graphics g) { + toolkit.lockAWT(); + try { + paint(g); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Prints the component and all of its subcomponents. + * + * @param g the Graphics to be used for painting. + */ + public void printAll(Graphics g) { + toolkit.lockAWT(); + try { + paintAll(g); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets the size of the Component specified by width and height + * parameters. + * + * @param width the width of the Component. + * @param height the height of the Component. + */ + public void setSize(int width, int height) { + toolkit.lockAWT(); + try { + resize(width, height); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets the size of the Component specified by Dimension object. + * + * @param d the new size of the Component. + */ + public void setSize(Dimension d) { + toolkit.lockAWT(); + try { + resize(d); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Deprecated: replaced by setSize(int, int) method. + * + * @param width the width. + * @param height the height. + * + * @deprecated Replaced by setSize(int, int) method. + */ + @Deprecated + public void resize(int width, int height) { + toolkit.lockAWT(); + try { + boundsMaskParam = NativeWindow.BOUNDS_NOMOVE; + setBounds(x, y, width, height); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Deprecated: replaced by setSize(int, int) method. + * + * @param size the size. + * + * @deprecated Replaced by setSize(int, int) method. + */ + @Deprecated + public void resize(Dimension size) { + toolkit.lockAWT(); + try { + setSize(size.width, size.height); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks whether or not this component is completely opaque. + * + * @return true, if this component is completely opaque, + * false by default. + */ + public boolean isOpaque() { + toolkit.lockAWT(); + try { + return behaviour.isOpaque(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Disables. + * + * @deprecated Replaced by setEnabled(boolean) method. + */ + @Deprecated + public void disable() { + toolkit.lockAWT(); + try { + setEnabledImpl(false); + } finally { + toolkit.unlockAWT(); + } + //???AWT: fireAccessibleStateChange(AccessibleState.ENABLED, false); + } + + /** + * Enables this component. + * + * @deprecated Replaced by setEnabled(boolean) method. + */ + @Deprecated + public void enable() { + toolkit.lockAWT(); + try { + setEnabledImpl(true); + } finally { + toolkit.unlockAWT(); + } + //???AWT: fireAccessibleStateChange(AccessibleState.ENABLED, true); + } + + /** + * Enables or disable this component. + * + * @param b the boolean parameter. + * + * @deprecated Replaced by setEnabled(boolean) method. + */ + @Deprecated + public void enable(boolean b) { + toolkit.lockAWT(); + try { + if (b) { + enable(); + } else { + disable(); + } + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Stores the location of this component to the specified Point object; + * returns the point of the component's top-left corner. + * + * @param rv the Point object where the component's top-left corner + * position will be stored. + * + * @return the Point which specifies the component's top-left corner. + */ + public Point getLocation(Point rv) { + toolkit.lockAWT(); + try { + if (rv == null) { + rv = new Point(); + } + rv.setLocation(getX(), getY()); + return rv; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the location of this component on the form; + * returns the point of the component's top-left corner. + * + * @return the Point which specifies the component's top-left corner. + */ + public Point getLocation() { + toolkit.lockAWT(); + try { + return location(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the size of this Component. + * + * @return the size of this Component. + */ + public Dimension getSize() { + toolkit.lockAWT(); + try { + return size(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Stores the size of this Component to the specified Dimension + * object. + * + * @param rv the Dimension object where the size of the Component + * will be stored. + * + * @return the Dimension of this Component. + */ + public Dimension getSize(Dimension rv) { + toolkit.lockAWT(); + try { + if (rv == null) { + rv = new Dimension(); + } + rv.setSize(getWidth(), getHeight()); + return rv; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks whether or not this Component is valid. A component is valid + * if it is correctly sized and positioned within its parent container + * and all its children are also valid. + * + * @return true, if the Component is valid, false otherwise. + */ + public boolean isValid() { + toolkit.lockAWT(); + try { + return valid && behaviour.isDisplayable(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Deprecated: replaced by getComponentAt(int, int) method. + * + * @return the Point. + * + * @deprecated Replaced by getComponentAt(int, int) method. + */ + @Deprecated + public Point location() { + toolkit.lockAWT(); + try { + return new Point(x, y); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Connects this Component to a native screen resource and makes it + * displayable. This method not be called directly by user applications. + */ + public void addNotify() { + toolkit.lockAWT(); + try { + prepare4HierarchyChange(); + behaviour.addNotify(); + //???AWT +// finishHierarchyChange(this, parent, 0); +// if (dropTarget != null) { +// dropTarget.addNotify(peer); +// } + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Map to display. + * + * @param b the b + */ + void mapToDisplay(boolean b) { + //???AWT + /* + if (b && !isDisplayable()) { + if ((this instanceof Window) || ((parent != null) && parent.isDisplayable())) { + addNotify(); + } + } else if (!b && isDisplayable()) { + removeNotify(); + } + */ + } + + /** + * Gets the toolkit. + * + * @return accessible context specific for particular component + */ + //???AWT + /* + AccessibleContext createAccessibleContext() { + return null; + } + + public AccessibleContext getAccessibleContext() { + toolkit.lockAWT(); + try { + if (accessibleContext == null) { + accessibleContext = createAccessibleContext(); + } + return accessibleContext; + } finally { + toolkit.unlockAWT(); + } + } + */ + + /** + * Gets Toolkit for the current Component. + * + * @return the Toolkit of this Component. + */ + public Toolkit getToolkit() { + return toolkit; + } + + /** + * Gets this component's locking object for AWT component tree + * and layout operations. + * + * @return the tree locking object. + */ + public final Object getTreeLock() { + return toolkit.awtTreeLock; + } + + /** + * @param evt the Event. + * @param what the event's key. + * + * @return true, if successful. + * + * @deprecated Use ActionListener class for registering event listener. + */ + @Deprecated + public boolean action(Event evt, Object what) { + // to be overridden: do nothing, + // just return false to propagate event up to the parent container + return false; + } + + + /** + * Gets the property change support. + * + * @return the property change support + */ + private PropertyChangeSupport getPropertyChangeSupport() { + synchronized (componentLock) { + if (propertyChangeSupport == null) { + propertyChangeSupport = new PropertyChangeSupport(this); + } + return propertyChangeSupport; + } + } + + //???AWT + /* + public void addPropertyChangeListener(PropertyChangeListener listener) { + getPropertyChangeSupport().addPropertyChangeListener(listener); + } + + public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { + getPropertyChangeSupport().addPropertyChangeListener(propertyName, listener); + } + + public void applyComponentOrientation(ComponentOrientation orientation) { + toolkit.lockAWT(); + try { + setComponentOrientation(orientation); + } finally { + toolkit.unlockAWT(); + } + } + */ + + /** + * Returns true if the set of focus traversal keys for the given focus + * traversal operation has been explicitly defined for this Component. + * + * @param id the ID of traversal key. + * + * @return true, if the set of focus traversal keys for the given focus + * traversal operation has been explicitly defined for this Component, + * false otherwise. + */ + public boolean areFocusTraversalKeysSet(int id) { + toolkit.lockAWT(); + try { + Integer Id = new Integer(id); + if (traversalKeys.containsKey(Id)) { + return traversalKeys.get(Id) != null; + } + // awt.14F=invalid focus traversal key identifier + throw new IllegalArgumentException(Messages.getString("awt.14F")); //$NON-NLS-1$ + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the bounds of the Component. + * + * @return the rectangle bounds of the Component. + * + * @deprecated Use getBounds() methood. + */ + @Deprecated + public Rectangle bounds() { + toolkit.lockAWT(); + try { + return new Rectangle(x, y, w, h); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Returns the construction status of a specified image + * with the specified width and height that is being created. + * + * + * @param image the image to be checked. + * @param width the width of scaled image which status is being checked, or -1. + * @param height the height of scaled image which status is being checked, or -1. + * @param observer the ImageObserver object to be notified while + * the image is being prepared. + * + * @return the ImageObserver flags of the current state of the image data. + */ + public int checkImage(Image image, int width, int height, ImageObserver observer) { + toolkit.lockAWT(); + try { + return toolkit.checkImage(image, width, height, observer); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Returns the construction status of a specified image that is being created. + * + * + * @param image the image to be checked. + * @param observer the ImageObserver object to be notified while + * the image is being prepared. + * + * @return the ImageObserver flags of the current state of the image data. + */ + public int checkImage(Image image, ImageObserver observer) { + toolkit.lockAWT(); + try { + return toolkit.checkImage(image, -1, -1, observer); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Coalesces the existed event with new event. + * + * @param existingEvent the existing event in the EventQueue. + * @param newEvent the new event to be posted to the EventQueue. + * + * @return the coalesced AWTEvent, or null if there is no coalescing done. + */ + protected AWTEvent coalesceEvents(AWTEvent existingEvent, AWTEvent newEvent) { + toolkit.lockAWT(); + try { + // Nothing to do: + // 1. Mouse events coalesced at WTK level + // 2. Paint events handled by RedrawManager + // This method is for overriding only + return null; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks if this Component is a coalescer. + * + * @return true, if is coalescer + */ + boolean isCoalescer() { + return coalescer; + } + + /** + * Gets the relative event. + * + * @param id the id + * + * @return the relative event + */ + AWTEvent getRelativeEvent(int id) { + Integer idWrapper = new Integer(id); + eventsList = eventsTable.get(idWrapper); + if (eventsList == null) { + eventsList = new LinkedList<AWTEvent>(); + eventsTable.put(idWrapper, eventsList); + return null; + } + if (eventsList.isEmpty()) { + return null; + } + return eventsList.getLast(); + } + + /** + * Adds the new event. + * + * @param event the event + */ + void addNewEvent(AWTEvent event) { + eventsList.addLast(event); + } + + /** + * Removes the relative event. + */ + void removeRelativeEvent() { + eventsList.removeLast(); + } + + /** + * Removes the next event. + * + * @param id the id + */ + void removeNextEvent(int id) { + eventsTable.get(new Integer(id)).removeFirst(); + } + + /** + * Creates the image with the specified ImageProducer. + * + * @param producer the ImageProducer to be used for image creation. + * + * @return the image with the specified ImageProducer. + */ + public Image createImage(ImageProducer producer) { + toolkit.lockAWT(); + try { + return toolkit.createImage(producer); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Creates an off-screen drawable image to be used for double buffering. + * + * @param width the width of the image. + * @param height the height of the image. + * + * @return the off-screen drawable image or null if the component is not + * displayable or GraphicsEnvironment.isHeadless() method returns true. + */ + public Image createImage(int width, int height) { + toolkit.lockAWT(); + try { + if (!isDisplayable()) { + return null; + } + GraphicsConfiguration gc = getGraphicsConfiguration(); + if (gc == null) { + return null; + } + ColorModel cm = gc.getColorModel(Transparency.OPAQUE); + WritableRaster wr = cm.createCompatibleWritableRaster(width, height); + Image image = new BufferedImage(cm, wr, cm.isAlphaPremultiplied(), null); + fillImageBackground(image, width, height); + return image; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Creates an off-screen drawable image with the specified width, + * height and ImageCapabilities. + * + * @param width the width + * @param height the height + * @param caps the ImageCapabilities. + * + * @return the volatile image + * + * @throws AWTException if an image with the specified capabilities + * cannot be created. + */ + public VolatileImage createVolatileImage(int width, int height, ImageCapabilities caps) + throws AWTException { + toolkit.lockAWT(); + try { + if (!isDisplayable()) { + return null; + } + GraphicsConfiguration gc = getGraphicsConfiguration(); + if (gc == null) { + return null; + } + VolatileImage image = gc.createCompatibleVolatileImage(width, height, caps); + fillImageBackground(image, width, height); + return image; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Creates a volatile off-screen drawable image which is used + * for double buffering. + * + * @param width the width of image. + * @param height the height of image. + * + * @return the volatile image a volatile off-screen drawable image + * which is used for double buffering or null if the component + * is not displayable, or GraphicsEnvironment.isHeadless() method + * returns true. + */ + public VolatileImage createVolatileImage(int width, int height) { + toolkit.lockAWT(); + try { + if (!isDisplayable()) { + return null; + } + GraphicsConfiguration gc = getGraphicsConfiguration(); + if (gc == null) { + return null; + } + VolatileImage image = gc.createCompatibleVolatileImage(width, height); + fillImageBackground(image, width, height); + return image; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Fill the image being created by createImage() or createVolatileImage() + * with the component's background color to prepare it for double-buffered + * painting. + * + * @param image the image + * @param width the width + * @param height the height + */ + private void fillImageBackground(Image image, int width, int height) { + Graphics gr = image.getGraphics(); + gr.setColor(getBackground()); + gr.fillRect(0, 0, width, height); + gr.dispose(); + } + + /** + * Delivers event. + * + * @param evt the event. + * + * @deprecated Replaced by dispatchEvent(AWTEvent e) method. + */ + @Deprecated + public void deliverEvent(Event evt) { + postEvent(evt); + } + + /** + * Prompts the layout manager to lay out this component. + */ + public void doLayout() { + toolkit.lockAWT(); + try { + layout(); + } finally { + toolkit.unlockAWT(); + } + // Implemented in Container + } + + /** + * Fire property change impl. + * + * @param propertyName the property name + * @param oldValue the old value + * @param newValue the new value + */ + private void firePropertyChangeImpl(String propertyName, Object oldValue, Object newValue) { + PropertyChangeSupport pcs; + synchronized (componentLock) { + if (propertyChangeSupport == null) { + return; + } + pcs = propertyChangeSupport; + } + pcs.firePropertyChange(propertyName, oldValue, newValue); + } + + /** + * Reports a bound property changes for int properties. + * + * @param propertyName the property name. + * @param oldValue the old property's value. + * @param newValue the new property's value. + */ + protected void firePropertyChange(String propertyName, int oldValue, int newValue) { + firePropertyChangeImpl(propertyName, new Integer(oldValue), new Integer(newValue)); + } + + /** + * Report a bound property change for a boolean-valued property. + * + * @param propertyName the property name. + * @param oldValue the property's old value. + * @param newValue the property's new value. + */ + protected void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) { + firePropertyChangeImpl(propertyName, Boolean.valueOf(oldValue), Boolean + .valueOf(newValue)); + } + + /** + * Reports a bound property change for an Object-valued property. + * + * @param propertyName the property name. + * @param oldValue the property's old value + * @param newValue the property's new value + */ + protected void firePropertyChange(final String propertyName, final Object oldValue, + final Object newValue) { + firePropertyChangeImpl(propertyName, oldValue, newValue); + } + + /** + * Report a bound property change for a byte-valued property. + * + * @param propertyName the property name. + * @param oldValue the property's old value. + * @param newValue the property's new value. + */ + public void firePropertyChange(String propertyName, byte oldValue, byte newValue) { + firePropertyChangeImpl(propertyName, new Byte(oldValue), new Byte(newValue)); + } + + /** + * Report a bound property change for a char-valued property. + * + * @param propertyName the property name. + * @param oldValue the old property's value. + * @param newValue the new property's value. + */ + public void firePropertyChange(String propertyName, char oldValue, char newValue) { + firePropertyChangeImpl(propertyName, new Character(oldValue), new Character(newValue)); + } + + /** + * Report a bound property change for a short-valued property. + * + * @param propertyName the property name. + * @param oldValue the old property's value. + * @param newValue the new property's value. + */ + public void firePropertyChange(String propertyName, short oldValue, short newValue) { + firePropertyChangeImpl(propertyName, new Short(oldValue), new Short(newValue)); + } + + /** + * Report a bound property change for a long-valued property. + * + * @param propertyName the property name. + * @param oldValue the old property's value. + * @param newValue the new property's value. + */ + public void firePropertyChange(String propertyName, long oldValue, long newValue) { + firePropertyChangeImpl(propertyName, new Long(oldValue), new Long(newValue)); + } + + /** + * Report a bound property change for a float-valued property. + * + * @param propertyName the property name. + * @param oldValue the old property's value. + * @param newValue the new property's value. + */ + public void firePropertyChange(String propertyName, float oldValue, float newValue) { + firePropertyChangeImpl(propertyName, new Float(oldValue), new Float(newValue)); + } + + /** + * Report a bound property change for a double-valued property. + * + * @param propertyName the property name. + * @param oldValue the old property's value. + * @param newValue the new property's value. + */ + public void firePropertyChange(String propertyName, double oldValue, double newValue) { + firePropertyChangeImpl(propertyName, new Double(oldValue), new Double(newValue)); + } + + /** + * Gets the alignment along the x axis. + * + * @return the alignment along the x axis. + */ + public float getAlignmentX() { + toolkit.lockAWT(); + try { + return CENTER_ALIGNMENT; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the alignment along the y axis. + * + * @return the alignment along y axis. + */ + public float getAlignmentY() { + toolkit.lockAWT(); + try { + return CENTER_ALIGNMENT; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the background color for this component. + * + * @return the background color for this component. + */ + public Color getBackground() { + toolkit.lockAWT(); + try { + //???AWT + /* + if ((backColor == null) && (parent != null)) { + return parent.getBackground(); + } + */ + return backColor; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the bounding rectangle of this component. + * + * @return the bounding rectangle of this component. + */ + public Rectangle getBounds() { + toolkit.lockAWT(); + try { + return bounds(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Writes the data of the bounding rectangle to the specified + * Rectangle object. + * + * @param rv the Rectangle object where the bounding rectangle's data is stored. + * + * @return the bounding rectangle. + */ + public Rectangle getBounds(Rectangle rv) { + toolkit.lockAWT(); + try { + if (rv == null) { + rv = new Rectangle(); + } + rv.setBounds(x, y, w, h); + return rv; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the color model of the Component. + * + * @return the color model of the Component. + */ + public ColorModel getColorModel() { + toolkit.lockAWT(); + try { + return getToolkit().getColorModel(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the Component which contains the specified Point. + * + * @param p the Point. + * + * @return the Component which contains the specified Point. + */ + public Component getComponentAt(Point p) { + toolkit.lockAWT(); + try { + return getComponentAt(p.x, p.y); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the Component which contains the point with the + * specified coordinates. + * + * @param x the x coordinate of the point. + * @param y the y coordinate of the point. + * + * @return the Component which contains the point with the + * specified coordinates. + */ + public Component getComponentAt(int x, int y) { + toolkit.lockAWT(); + try { + return locate(x, y); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the component's orientation. + * + * @return the component's orientation. + */ + public ComponentOrientation getComponentOrientation() { + toolkit.lockAWT(); + try { + return orientation; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the cursor of the Component. + * + * @return the Cursor. + */ + public Cursor getCursor() { + toolkit.lockAWT(); + try { + if (cursor != null) { + return cursor; + //???AWT + /* + } else if (parent != null) { + return parent.getCursor(); + */ + } + return Cursor.getDefaultCursor(); + } finally { + toolkit.unlockAWT(); + } + } + + //???AWT + /* + public DropTarget getDropTarget() { + toolkit.lockAWT(); + try { + return dropTarget; + } finally { + toolkit.unlockAWT(); + } + } + + public Container getFocusCycleRootAncestor() { + toolkit.lockAWT(); + try { + for (Container c = parent; c != null; c = c.getParent()) { + if (c.isFocusCycleRoot()) { + return c; + } + } + return null; + } finally { + toolkit.unlockAWT(); + } + } + + @SuppressWarnings("unchecked") + public Set<AWTKeyStroke> getFocusTraversalKeys(int id) { + toolkit.lockAWT(); + try { + Integer kId = new Integer(id); + KeyboardFocusManager.checkTraversalKeysID(traversalKeys, kId); + Set<? extends AWTKeyStroke> keys = traversalKeys.get(kId); + if (keys == null && parent != null) { + keys = parent.getFocusTraversalKeys(id); + } + if (keys == null) { + keys = KeyboardFocusManager.getCurrentKeyboardFocusManager() + .getDefaultFocusTraversalKeys(id); + } + return (Set<AWTKeyStroke>) keys; + } finally { + toolkit.unlockAWT(); + } + } + */ + + /** + * Checks if the the focus traversal keys are enabled for this component. + * + * @return true, if the the focus traversal keys are enabled for + * this component, false otherwise. + */ + public boolean getFocusTraversalKeysEnabled() { + toolkit.lockAWT(); + try { + return focusTraversalKeysEnabled; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the font metrics of the specified Font. + * + * @param f the Font. + * + * @return the FontMetrics of the specified Font. + */ + @SuppressWarnings("deprecation") + public FontMetrics getFontMetrics(Font f) { + return toolkit.getFontMetrics(f); + } + + /** + * Gets the foreground color of the Component. + * + * @return the foreground color of the Component. + */ + public Color getForeground() { + toolkit.lockAWT(); + try { + //???AWT + /* + if (foreColor == null && parent != null) { + return parent.getForeground(); + } + */ + return foreColor; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the Graphics of the Component or null if this Component + * is not displayable. + * + * @return the Graphics of the Component or null if this Component + * is not displayable. + */ + public Graphics getGraphics() { + toolkit.lockAWT(); + try { + if (!isDisplayable()) { + return null; + } + Graphics g = behaviour.getGraphics(0, 0, w, h); + g.setColor(foreColor); + g.setFont(font); + return g; + } finally { + toolkit.unlockAWT(); + } + } + + + /** + * Gets the GraphicsConfiguration associated with this Component. + * + * @return the GraphicsConfiguration associated with this Component. + */ + public GraphicsConfiguration getGraphicsConfiguration() { + //???AWT + /* + toolkit.lockAWT(); + try { + Window win = getWindowAncestor(); + if (win == null) { + return null; + } + return win.getGraphicsConfiguration(); + } finally { + toolkit.unlockAWT(); + } + */ + return null; + } + + /** + * Gets the height of the Component. + * + * @return the height of the Component. + */ + public int getHeight() { + toolkit.lockAWT(); + try { + return h; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Returns true if paint messages received from the operating system + * should be ignored. + * + * @return true if paint messages received from the operating system + * should be ignored, false otherwise. + */ + public boolean getIgnoreRepaint() { + toolkit.lockAWT(); + try { + return ignoreRepaint; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the input context of this component for handling + * the communication with input methods when text is entered + * in this component. + * + * @return the InputContext used by this Component or + * null if no context is specifined. + */ + public InputContext getInputContext() { + toolkit.lockAWT(); + try { + //???AWT + /* + Container parent = getParent(); + if (parent != null) { + return parent.getInputContext(); + } + */ + return null; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the input method request handler which supports requests + * from input methods for this component, or null for default. + * + * @return the input method request handler which supports requests + * from input methods for this component, or null for default. + */ + public InputMethodRequests getInputMethodRequests() { + return null; + } + + /** + * Gets the locale of this Component. + * + * @return the locale of this Component. + */ + public Locale getLocale() { + toolkit.lockAWT(); + try { + //???AWT + /* + if (locale == null) { + if (parent == null) { + if (this instanceof Window) { + return Locale.getDefault(); + } + // awt.150=no parent + throw new IllegalComponentStateException(Messages.getString("awt.150")); //$NON-NLS-1$ + } + return getParent().getLocale(); + } + */ + return locale; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the location of this component in the form of a point + * specifying the component's top-left corner in the + * screen's coordinate space. + * + * @return the Point giving the component's location in the + * screen's coordinate space. + * + * @throws IllegalComponentStateException if the component is + * not shown on the screen. + */ + public Point getLocationOnScreen() throws IllegalComponentStateException { + toolkit.lockAWT(); + try { + Point p = new Point(); + if (isShowing()) { + //???AWT + /* + Component comp; + for (comp = this; comp != null && !(comp instanceof Window); comp = comp + .getParent()) { + p.translate(comp.getX(), comp.getY()); + } + if (comp instanceof Window) { + p.translate(comp.getX(), comp.getY()); + } + */ + return p; + } + // awt.151=component must be showing on the screen to determine its location + throw new IllegalComponentStateException(Messages.getString("awt.151")); //$NON-NLS-1$ + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the peer. This method should not be called directly by + * user applications. + * + * @return the ComponentPeer. + * + * @deprecated Replaced by isDisplayable(). + */ + @Deprecated + public ComponentPeer getPeer() { + toolkit.lockAWT(); + try { + if (behaviour.isDisplayable()) { + return peer; + } + return null; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets an array of the property change listeners registered to + * this Component. + * + * @return an array of the PropertyChangeListeners registered to + * this Component. + */ + public PropertyChangeListener[] getPropertyChangeListeners() { + return getPropertyChangeSupport().getPropertyChangeListeners(); + } + + /** + * Gets an array of PropertyChangeListener objects registered + * to this Component for the specified property. + * + * @param propertyName the property name. + * + * @return an array of PropertyChangeListener objects registered + * to this Component for the specified property. + */ + public PropertyChangeListener[] getPropertyChangeListeners(String propertyName) { + return getPropertyChangeSupport().getPropertyChangeListeners(propertyName); + } + + /** + * Gets the width of the Component. + * + * @return the width of the Component. + */ + public int getWidth() { + toolkit.lockAWT(); + try { + return w; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the x coordinate of the component's top-left corner. + * + * @return the x coordinate of the component's top-left corner. + */ + public int getX() { + toolkit.lockAWT(); + try { + return x; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the y coordinate of the component's top-left corner. + * + * @return the y coordinate of the component's top-left corner. + */ + public int getY() { + toolkit.lockAWT(); + try { + return y; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Got the focus. + * + * @param evt the Event. + * @param what the Object. + * + * @return true, if successful. + * + * @deprecated Replaced by processFocusEvent(FocusEvent) method. + */ + @Deprecated + public boolean gotFocus(Event evt, Object what) { + // to be overridden: do nothing, + // just return false to propagate event up to the parent container + return false; + } + + /** + * Handles event. + * + * @param evt the Event. + * + * @return true, if successful. + * + * @deprecated Replaced by processEvent(AWTEvent) method. + */ + @Deprecated + public boolean handleEvent(Event evt) { + switch (evt.id) { + case Event.ACTION_EVENT: + return action(evt, evt.arg); + case Event.GOT_FOCUS: + return gotFocus(evt, null); + case Event.LOST_FOCUS: + return lostFocus(evt, null); + case Event.MOUSE_DOWN: + return mouseDown(evt, evt.x, evt.y); + case Event.MOUSE_DRAG: + return mouseDrag(evt, evt.x, evt.y); + case Event.MOUSE_ENTER: + return mouseEnter(evt, evt.x, evt.y); + case Event.MOUSE_EXIT: + return mouseExit(evt, evt.x, evt.y); + case Event.MOUSE_MOVE: + return mouseMove(evt, evt.x, evt.y); + case Event.MOUSE_UP: + return mouseUp(evt, evt.x, evt.y); + case Event.KEY_ACTION: + case Event.KEY_PRESS: + return keyDown(evt, evt.key); + case Event.KEY_ACTION_RELEASE: + case Event.KEY_RELEASE: + return keyUp(evt, evt.key); + } + return false;// event not handled + } + + /** + * Checks whether the Component is the focus owner or not. + * + * @return true, if the Component is the focus owner, false otherwise. + */ + public boolean hasFocus() { + toolkit.lockAWT(); + try { + //???AWT: return isFocusOwner(); + return false; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Hides the Component. + * + * @deprecated Replaced by setVisible(boolean) method. + */ + @Deprecated + public void hide() { + toolkit.lockAWT(); + try { + if (!visible) { + return; + } + prepare4HierarchyChange(); + visible = false; + moveFocusOnHide(); + behaviour.setVisible(false); + postEvent(new ComponentEvent(this, ComponentEvent.COMPONENT_HIDDEN)); + //???AWT: finishHierarchyChange(this, parent, 0); + notifyInputMethod(null); + //???AWT: invalidateRealParent(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks whether or not the point with the specified coordinates + * belongs to the Commponent. + * + * @param x the x coordinate of the Point. + * @param y the y coordinate of the Point. + * + * @return true, if the point with the specified coordinates + * belongs to the Commponent, false otherwise. + * + * @deprecated Replaced by contains(int, int) method. + */ + @Deprecated + public boolean inside(int x, int y) { + toolkit.lockAWT(); + try { + return x >= 0 && x < getWidth() && y >= 0 && y < getHeight(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Invalidates the component, this component and all parents + * above it are marked as needing to be laid out. + */ + public void invalidate() { + toolkit.lockAWT(); + try { + valid = false; + resetDefaultSize(); + //???AWT: invalidateRealParent(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks whether or not the background color is set to this Component. + * + * @return true, if the background color is set to this Component, + * false otherwise. + */ + public boolean isBackgroundSet() { + toolkit.lockAWT(); + try { + return backColor != null; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks whether or not a cursor is set for the Component. + * + * @return true, if a cursor is set for the Component, + * false otherwise. + */ + public boolean isCursorSet() { + toolkit.lockAWT(); + try { + return cursor != null; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks whether or not this Component is displayable. + * + * @return true, if this Component is displayable, false otherwise. + */ + public boolean isDisplayable() { + toolkit.lockAWT(); + try { + return behaviour.isDisplayable(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks whether or not this component is painted to an buffer + * which is copied to the screen later. + * + * @return true, if this component is painted to an buffer + * which is copied to the screen later, false otherwise. + */ + public boolean isDoubleBuffered() { + toolkit.lockAWT(); + try { + // false by default + return false; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks whether or not this Component is enabled. + * + * @return true, if this Component is enabled, false otherwise. + */ + public boolean isEnabled() { + toolkit.lockAWT(); + try { + return enabled; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * "Recursive" isEnabled(). + * + * @return true if not only component itself is enabled but its heavyweight + * parent is also "indirectly" enabled + */ + boolean isIndirectlyEnabled() { + Component comp = this; + while (comp != null) { + if (!comp.isLightweight() && !comp.isEnabled()) { + return false; + } + //???AWT: comp = comp.getRealParent(); + } + return true; + } + + /** + * Checks if the component is key enabled. + * + * @return true, if the component is enabled and indirectly enabled + */ + boolean isKeyEnabled() { + if (!isEnabled()) { + return false; + } + return isIndirectlyEnabled(); + } + + /** + * Gets only parent of a child component, but not owner of a window. + * + * @return parent of child component, null if component is a top-level + * (Window instance) + */ + //???AWT + /* + Container getRealParent() { + return (!(this instanceof Window) ? getParent() : null); + } + + public boolean isFocusCycleRoot(Container container) { + toolkit.lockAWT(); + try { + return getFocusCycleRootAncestor() == container; + } finally { + toolkit.unlockAWT(); + } + } + + public boolean isFocusOwner() { + toolkit.lockAWT(); + try { + return KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == this; + } finally { + toolkit.unlockAWT(); + } + } + */ + + /** + * Checks whether or not this Component can be focusable. + * + * @return true, if this Component can be focusable, false otherwise. + * + * @deprecated Replaced by isFocusable(). + */ + @Deprecated + public boolean isFocusTraversable() { + toolkit.lockAWT(); + try { + overridenIsFocusable = false; + return focusable; // a Component must either be both focusable and + // focus traversable, or neither + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks if this Component can be focusable or not. + * + * @return true, if this Component can be focusable, false otherwise. + */ + public boolean isFocusable() { + toolkit.lockAWT(); + try { + return isFocusTraversable(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks if the Font is set for this Component or not. + * + * @return true, if the Font is set, false otherwise. + */ + public boolean isFontSet() { + toolkit.lockAWT(); + try { + return font != null; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks if foreground color is set for the Component or not. + * + * @return true, if is foreground color is set for the Component, + * false otherwise. + */ + public boolean isForegroundSet() { + toolkit.lockAWT(); + try { + return foreColor != null; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Returns true if this component has a lightweight peer. + * + * @return true, if this component has a lightweight peer, + * false if it has a native peer or no peer. + */ + public boolean isLightweight() { + toolkit.lockAWT(); + try { + return behaviour.isLightweight(); + } finally { + toolkit.unlockAWT(); + } + } + + + /** + * Checks whether or not this Component is shown. + * + * @return true, if this Component is shown, false otherwise. + */ + public boolean isShowing() { + //???AWT + /* + toolkit.lockAWT(); + try { + return (isVisible() && isDisplayable() && (parent != null) && parent.isShowing()); + } finally { + toolkit.unlockAWT(); + } + */ + return false; + } + + /** + * Checks whether or not this Component is visible. + * + * @return true, if the Component is visible, false otherwise. + */ + public boolean isVisible() { + toolkit.lockAWT(); + try { + return visible; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Deprecated: replaced by processKeyEvent(KeyEvent) method. + * + * @param evt the Event. + * @param key the key code. + * + * @return true, if successful. + * + * @deprecated Replaced by replaced by processKeyEvent(KeyEvent) method. + */ + @Deprecated + public boolean keyDown(Event evt, int key) { + // to be overridden: do nothing, + // just return false to propagate event up to the parent container + return false; + } + + /** + * Deprecated: replaced by processKeyEvent(KeyEvent) method. + * + * @param evt the Event. + * @param key the key code. + * + * @return true, if successful. + * + * @deprecated Replaced by processKeyEvent(KeyEvent) method. + */ + @Deprecated + public boolean keyUp(Event evt, int key) { + // to be overridden: do nothing, + // just return false to propagate event up to the parent container + return false; + } + + /** + * Deprecated: Replaced by doLayout() method. + * + * @deprecated Replaced by doLayout() method. + */ + @Deprecated + public void layout() { + toolkit.lockAWT(); + try { + // Implemented in Container + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Deprecated: replaced by getComponentAt(int, int) method. + * + * @param x the x coordinate. + * @param y the y coordinate. + * + * @return The component. + * + * @deprecated Replaced by getComponentAt(int, int) method. + */ + @Deprecated + public Component locate(int x, int y) { + toolkit.lockAWT(); + try { + if (contains(x, y)) { + return this; + } + return null; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Deprecated: replaced by processFocusEvent(FocusEvent). + * + * @param evt the Event. + * @param what the Object. + * + * @return true, if successful. + * + * @deprecated Replaced by processFocusEvent(FocusEvent). + */ + @Deprecated + public boolean lostFocus(Event evt, Object what) { + // to be overridden: do nothing, + // just return false to propagate event up to the parent container + return false; + } + + /** + * Deprecated: replaced by processMouseEvent(MouseEvent) method. + * + * @param evt the MouseEvent. + * @param x the x coordinate. + * @param y the y coordinate. + * + * @return true, if successful. + * + * @deprecated Replaced by processMouseEvent(MouseEvent) method. + */ + @Deprecated + public boolean mouseDown(Event evt, int x, int y) { + // to be overridden: do nothing, + // just return false to propagate event up to the parent container + return false; + } + + /** + * Deprecated: replaced by getMinimumSize() method. + * + * @param evt the Event. + * @param x the x coordinate. + * @param y the y coordinate. + * + * @return true, if successful. + * + * @deprecated Replaced by getMinimumSize() method. + */ + @Deprecated + public boolean mouseDrag(Event evt, int x, int y) { + // to be overridden: do nothing, + // just return false to propagate event up to the parent container + return false; + } + + /** + * Replaced by processMouseEvent(MouseEvent) method. + * + * @param evt the Event. + * @param x the x coordinate. + * @param y the y coordinate. + * + * @return true, if successful. + * + * @deprecated replaced by processMouseEvent(MouseEvent) method. + */ + @Deprecated + public boolean mouseEnter(Event evt, int x, int y) { + // to be overridden: do nothing, + // just return false to propagate event up to the parent container + return false; + } + + /** + * Replaced by processMouseEvent(MouseEvent) method. + * + * @param evt the Event. + * @param x the x coordinate. + * @param y the y coordinate. + * + * @return true, if successful. + * + * @deprecated Replaced by processMouseEvent(MouseEvent) method. + */ + @Deprecated + public boolean mouseExit(Event evt, int x, int y) { + // to be overridden: do nothing, + // just return false to propagate event up to the parent container + return false; + } + + /** + * Replaced by processMouseEvent(MouseEvent) method. + * + * @param evt the Event. + * @param x the x coordinate. + * @param y the y coordinate. + * + * @deprecated Replaced by processMouseEvent(MouseEvent) method. + * + * @return true, if successful. + */ + @Deprecated + public boolean mouseMove(Event evt, int x, int y) { + // to be overridden: do nothing, + // just return false to propagate event up to the parent container + return false; + } + + /** + * Replaced by processMouseEvent(MouseEvent) method. + * + * @param evt the Event. + * @param x the x coordinate. + * @param y the y coordinate. + * + * @return true, if successful. + * + * @deprecated Replaced by processMouseEvent(MouseEvent) method. + */ + @Deprecated + public boolean mouseUp(Event evt, int x, int y) { + // to be overridden: do nothing, + // just return false to propagate event up to the parent container + return false; + } + + /** + * Deprecated: replaced by setLocation(int, int) method. + * + * @param x the x coordinates. + * @param y the y coordinates. + * + * @deprecated Replaced by setLocation(int, int) method. + */ + @Deprecated + public void move(int x, int y) { + toolkit.lockAWT(); + try { + boundsMaskParam = NativeWindow.BOUNDS_NOSIZE; + setBounds(x, y, w, h); + } finally { + toolkit.unlockAWT(); + } + } + + //???AWT + /* + @Deprecated + public void nextFocus() { + toolkit.lockAWT(); + try { + transferFocus(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS); + } finally { + toolkit.unlockAWT(); + } + } + */ + + /** + * Returns a string representation of the component's state. + * + * @return the string representation of the component's state. + */ + protected String paramString() { + /* + * The format is based on 1.5 release behavior which can be revealed by + * the following code: + * + * Component c = new Component(){}; c.setVisible(false); + * System.out.println(c); + */ + toolkit.lockAWT(); + try { + return getName() + "," + getX() + "," + getY() + "," + getWidth() + "x" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + + getHeight() + (!isVisible() ? ",hidden" : ""); //$NON-NLS-1$ //$NON-NLS-2$ + } finally { + toolkit.unlockAWT(); + } + } + + @Deprecated + @SuppressWarnings("deprecation") + public boolean postEvent(Event evt) { + boolean handled = handleEvent(evt); + if (handled) { + return true; + } + //???AWT + /* + + // propagate non-handled events up to parent + Component par = parent; + // try to call postEvent only on components which + // override any of deprecated method handlers + // while (par != null && !par.deprecatedEventHandler) { + // par = par.parent; + // } + // translate event coordinates before posting it to parent + if (par != null) { + evt.translate(x, y); + par.postEvent(evt); + } + + */ + return false; + } + + /** + * Prepares an image for rendering on the Component. + * + * @param image the Image to be prepared. + * @param observer the ImageObserver object to be notified as soon as + * the image is prepared. + * + * @return true if the image has been fully prepared, + * false otherwise. + */ + public boolean prepareImage(Image image, ImageObserver observer) { + toolkit.lockAWT(); + try { + return toolkit.prepareImage(image, -1, -1, observer); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Prepares an image for rendering on the Component with the + * specified width, height, and ImageObserver. + * + * @param image the Image to be prepared. + * @param width the width of scaled image. + * @param height the height of scaled height. + * @param observer the ImageObserver object to be notified as soon as + * the image is prepared. + * + * @return true if the image is been fully prepared, + * false otherwise. + */ + public boolean prepareImage(Image image, int width, int height, ImageObserver observer) { + toolkit.lockAWT(); + try { + return toolkit.prepareImage(image, width, height, observer); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Makes this Component undisplayable. + */ + public void removeNotify() { + toolkit.lockAWT(); + try { + //???AWT + /* + if (dropTarget != null) { + dropTarget.removeNotify(peer); + } + */ + prepare4HierarchyChange(); + ///???AWT: moveFocus(); + behaviour.removeNotify(); + //???AWT: finishHierarchyChange(this, parent, 0); + removeNotifyInputContext(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Calls InputContext.removeNotify + */ + private void removeNotifyInputContext() { + if (!inputMethodsEnabled) { + return; + } + InputContext ic = getInputContext(); + if (ic != null) { + //???AWT: ic.removeNotify(this); + } + } + + /** + * This method is called when some property of a component changes, making + * it unfocusable, e. g. hide(), removeNotify(), setEnabled(false), + * setFocusable(false) is called, and therefore automatic forward focus + * traversal is necessary + */ + //???AWT + /* + void moveFocus() { + // don't use transferFocus(), but query focus traversal policy directly + // and if it returns null, transfer focus up cycle + // and find next focusable component there + KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager(); + Container root = kfm.getCurrentFocusCycleRoot(); + Component nextComp = this; + boolean success = !isFocusOwner(); + while (!success) { + if (root != nextComp.getFocusCycleRootAncestor()) { + // component was probably removed from container + // so focus will be lost in some time + return; + } + nextComp = root.getFocusTraversalPolicy().getComponentAfter(root, nextComp); + if (nextComp == this) { + nextComp = null; // avoid looping + } + if (nextComp != null) { + success = nextComp.requestFocusInWindow(); + } else { + nextComp = root; + root = root.getFocusCycleRootAncestor(); + // if no acceptable component is found at all - clear global + // focus owner + if (root == null) { + if (nextComp instanceof Window) { + Window wnd = (Window) nextComp; + wnd.setFocusOwner(null); + wnd.setRequestedFocus(null); + } + kfm.clearGlobalFocusOwner(); + return; + } + } + } + } + */ + + /** + * For Container there's a difference between moving focus when being made + * invisible or made unfocusable in some other way, because when container + * is made invisible, component still remains visible, i. e. its hide() or + * setVisible() is not called. + */ + void moveFocusOnHide() { + //???AWT: moveFocus(); + } + + /** + * Removes the property change listener registered for this component. + * + * @param listener the PropertyChangeListener. + */ + public void removePropertyChangeListener(PropertyChangeListener listener) { + getPropertyChangeSupport().removePropertyChangeListener(listener); + } + + /** + * Removes the property change listener registered fot this component + * for the specified propertyy. + * + * @param propertyName the property name. + * @param listener the PropertyChangeListener. + */ + public void removePropertyChangeListener(String propertyName, + PropertyChangeListener listener) { + getPropertyChangeSupport().removePropertyChangeListener(propertyName, listener); + } + + + /** + * Repaints the specified rectangle of this component within + * tm milliseconds. + * + * @param tm the time in milliseconds before updating. + * @param x the x coordinate of Rectangle. + * @param y the y coordinate of Rectangle. + * @param width the width of Rectangle. + * @param height the height of Rectangle. + */ + public void repaint(long tm, int x, int y, int width, int height) { + //???AWT + /* + toolkit.lockAWT(); + try { + if (width <= 0 || height <= 0 || (redrawManager == null) || !isShowing()) { + return; + } + if (behaviour instanceof LWBehavior) { + if (parent == null || !parent.visible || !parent.behaviour.isDisplayable()) { + return; + } + if (repaintRegion == null) { + repaintRegion = new MultiRectArea(new Rectangle(x, y, width, height)); + } + repaintRegion.intersect(new Rectangle(0, 0, this.w, this.h)); + repaintRegion.translate(this.x, this.y); + parent.repaintRegion = repaintRegion; + repaintRegion = null; + parent.repaint(tm, x + this.x, y + this.y, width, height); + } else { + if (repaintRegion != null) { + redrawManager.addUpdateRegion(this, repaintRegion); + repaintRegion = null; + } else { + redrawManager.addUpdateRegion(this, new Rectangle(x, y, width, height)); + } + toolkit.getSystemEventQueueCore().notifyEventMonitor(toolkit); + } + } finally { + toolkit.unlockAWT(); + } + */ + } + + /** + * Post event. + * + * @param e the e + */ + void postEvent(AWTEvent e) { + getToolkit().getSystemEventQueueImpl().postEvent(e); + } + + /** + * Repaints the specified Rectangle of this Component. + * + * @param x the x coordinate of Rectangle. + * @param y the y coordinate of Rectangle. + * @param width the width of Rectangle. + * @param height the height of Rectangle. + */ + public void repaint(int x, int y, int width, int height) { + toolkit.lockAWT(); + try { + repaint(0, x, y, width, height); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Repaints this component. + */ + public void repaint() { + toolkit.lockAWT(); + try { + if (w > 0 && h > 0) { + repaint(0, 0, 0, w, h); + } + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Repaints the component within tm milliseconds. + * + * @param tm the time in milliseconds before updating. + */ + public void repaint(long tm) { + toolkit.lockAWT(); + try { + repaint(tm, 0, 0, w, h); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Requests that this Component get the input focus temporarily. + * This component must be displayable, visible, and focusable. + * + * @param temporary this parameter is true if the focus change + * is temporary, when the window loses the focus. + * + * @return true if the focus change request is succeeded, + * false otherwise. + */ + protected boolean requestFocus(boolean temporary) { + toolkit.lockAWT(); + try { + //???AWT: return requestFocusImpl(temporary, true, false); + } finally { + toolkit.unlockAWT(); + } + //???AWT + return false; + } + + /** + * Requests that this Component get the input focus. + * This component must be displayable, visible, and focusable. + */ + public void requestFocus() { + toolkit.lockAWT(); + try { + requestFocus(false); + } finally { + toolkit.unlockAWT(); + } + } + + //???AWT + /* + protected boolean requestFocusInWindow(boolean temporary) { + toolkit.lockAWT(); + try { + Window wnd = getWindowAncestor(); + if ((wnd == null) || !wnd.isFocused()) { + return false; + } + return requestFocusImpl(temporary, false, false); + } finally { + toolkit.unlockAWT(); + } + } + + boolean requestFocusImpl(boolean temporary, boolean crossWindow, boolean rejectionRecovery) { + if (!rejectionRecovery && isFocusOwner()) { + return true; + } + Window wnd = getWindowAncestor(); + Container par = getRealParent(); + if ((par != null) && par.isRemoved) { + return false; + } + if (!isShowing() || !isFocusable() || !wnd.isFocusableWindow()) { + return false; + } + return KeyboardFocusManager.getCurrentKeyboardFocusManager().requestFocus(this, + temporary, crossWindow, true); + } + + public boolean requestFocusInWindow() { + toolkit.lockAWT(); + try { + return requestFocusInWindow(false); + } finally { + toolkit.unlockAWT(); + } + } + */ + + /** + * Deprecated: replaced by setBounds(int, int, int, int) method. + * + * @param x the x coordinate. + * @param y the y coordinate. + * @param w the width. + * @param h the height. + * + * @deprecated Replaced by setBounds(int, int, int, int) method. + */ + @Deprecated + public void reshape(int x, int y, int w, int h) { + toolkit.lockAWT(); + try { + setBounds(x, y, w, h, boundsMaskParam, true); + boundsMaskParam = 0; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets rectangle for this Component to be the rectangle with the specified + * x,y coordinates of the top-left corner and the width and height. + * + * @param x the x coordinate of the rectangle's top-left corner. + * @param y the y coordinate of the rectangle's top-left corner. + * @param w the width of rectangle. + * @param h the height of rectangle. + */ + public void setBounds(int x, int y, int w, int h) { + toolkit.lockAWT(); + try { + reshape(x, y, w, h); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets rectangle for this Component to be the rectangle with the specified + * x,y coordinates of the top-left corner and the width and height + * and posts the appropriate events. + * + * @param x the x coordinate of the rectangle's top-left corner. + * @param y the y coordinate of the rectangle's top-left corner. + * @param w the width of rectangle. + * @param h the height of rectangle. + * @param bMask the bitmask of bounds options + * @param updateBehavior the whether to update the behavoir's bounds as well + */ + void setBounds(int x, int y, int w, int h, int bMask, boolean updateBehavior) { + int oldX = this.x; + int oldY = this.y; + int oldW = this.w; + int oldH = this.h; + setBoundsFields(x, y, w, h, bMask); + // Moved + if ((oldX != this.x) || (oldY != this.y)) { + //???AWT: invalidateRealParent(); + postEvent(new ComponentEvent(this, ComponentEvent.COMPONENT_MOVED)); + spreadHierarchyBoundsEvents(this, HierarchyEvent.ANCESTOR_MOVED); + } + // Resized + if ((oldW != this.w) || (oldH != this.h)) { + invalidate(); + postEvent(new ComponentEvent(this, ComponentEvent.COMPONENT_RESIZED)); + spreadHierarchyBoundsEvents(this, HierarchyEvent.ANCESTOR_RESIZED); + } + if (updateBehavior) { + behaviour.setBounds(this.x, this.y, this.w, this.h, bMask); + } + notifyInputMethod(new Rectangle(x, y, w, h)); + } + + /** + * Calls InputContextImpl.notifyClientWindowChanged. + * + * @param bounds the bounds + */ + void notifyInputMethod(Rectangle bounds) { + // only Window actually notifies IM of bounds change + } + + /** + * Sets the bounds fields. + * + * @param x the x + * @param y the y + * @param w the w + * @param h the h + * @param bMask the b mask + */ + private void setBoundsFields(int x, int y, int w, int h, int bMask) { + if ((bMask & NativeWindow.BOUNDS_NOSIZE) == 0) { + this.w = w; + this.h = h; + } + if ((bMask & NativeWindow.BOUNDS_NOMOVE) == 0) { + this.x = x; + this.y = y; + } + } + + /** + * Gets the native insets. + * + * @return the native insets + */ + Insets getNativeInsets() { + return new Insets(0, 0, 0, 0); + } + + /** + * Gets the insets. + * + * @return the insets + */ + Insets getInsets() { + return new Insets(0, 0, 0, 0); + } + + /** + * Checks if is mouse exited expected. + * + * @return true, if is mouse exited expected + */ + boolean isMouseExitedExpected() { + return mouseExitedExpected; + } + + /** + * Sets the mouse exited expected. + * + * @param expected the new mouse exited expected + */ + void setMouseExitedExpected(boolean expected) { + mouseExitedExpected = expected; + } + + /** + * Sets the new bounding rectangle for this Component. + * + * @param r the new bounding rectangle. + */ + public void setBounds(Rectangle r) { + toolkit.lockAWT(); + try { + setBounds(r.x, r.y, r.width, r.height); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets the component orientation which affects the component's + * elements and text within this component. + * + * @param o the ComponentOrientation object. + */ + public void setComponentOrientation(ComponentOrientation o) { + ComponentOrientation oldOrientation; + toolkit.lockAWT(); + try { + oldOrientation = orientation; + orientation = o; + } finally { + toolkit.unlockAWT(); + } + firePropertyChange("componentOrientation", oldOrientation, orientation); //$NON-NLS-1$ + invalidate(); + } + + /** + * Sets the specified cursor for this Component. + * + * @param cursor the new Cursor. + */ + public void setCursor(Cursor cursor) { + toolkit.lockAWT(); + try { + this.cursor = cursor; + setCursor(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Set current cursor shape to Component's Cursor. + */ + void setCursor() { + if (isDisplayable() && isShowing()) { + Rectangle absRect = new Rectangle(getLocationOnScreen(), getSize()); + Point absPointerPos = toolkit.dispatcher.mouseDispatcher.getPointerPos(); + //???AWT + /* + if (absRect.contains(absPointerPos)) { + // set Cursor only on top-level Windows(on X11) + Window topLevelWnd = getWindowAncestor(); + if (topLevelWnd != null) { + Point pointerPos = MouseDispatcher.convertPoint(null, absPointerPos, + topLevelWnd); + Component compUnderCursor = topLevelWnd.findComponentAt(pointerPos); + // if (compUnderCursor == this || + // compUnderCursor.getCursorAncestor() == this) { + NativeWindow wnd = topLevelWnd.getNativeWindow(); + if (compUnderCursor != null && wnd != null) { + compUnderCursor.getRealCursor().getNativeCursor() + .setCursor(wnd.getId()); + } + // } + } + } + */ + } + } + + /** + * Gets the ancestor Cursor if Component is disabled (directly or via an + * ancestor) even if Cursor is explicitly set. + * + * @param value the value + * + * @return actual Cursor to be displayed + */ + //???AWT + /* + Cursor getRealCursor() { + Component cursorAncestor = getCursorAncestor(); + return cursorAncestor != null ? cursorAncestor.getCursor() : Cursor.getDefaultCursor(); + } + */ + + /** + * Gets the ancestor(or component itself) whose cursor is set when pointer + * is inside component + * + * @return actual Cursor to be displayed + */ + //???AWT + /* + Component getCursorAncestor() { + Component comp; + for (comp = this; comp != null; comp = comp.getParent()) { + if (comp instanceof Window || comp.isCursorSet() && comp.isKeyEnabled()) { + return comp; + } + } + return null; + } + + public void setDropTarget(DropTarget dt) { + toolkit.lockAWT(); + try { + if (dropTarget == dt) { + return; + } + DropTarget oldDropTarget = dropTarget; + dropTarget = dt; + if (oldDropTarget != null) { + if (behaviour.isDisplayable()) { + oldDropTarget.removeNotify(peer); + } + oldDropTarget.setComponent(null); + } + if (dt != null) { + dt.setComponent(this); + if (behaviour.isDisplayable()) { + dt.addNotify(peer); + } + } + } finally { + toolkit.unlockAWT(); + } + } + */ + + /** + * Sets this component to the "enabled" or "disabled" state depending + * on the specified boolean parameter. + * + * @param value true if this component should be enabled; false + * if this component should be disabled. + */ + public void setEnabled(boolean value) { + toolkit.lockAWT(); + try { + enable(value); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets the enabled impl. + * + * @param value the new enabled impl + */ + void setEnabledImpl(boolean value) { + if (enabled != value) { + enabled = value; + setCursor(); + if (!enabled) { + moveFocusOnHide(); + } + behaviour.setEnabled(value); + } + } + + //???AWT + /* + private void fireAccessibleStateChange(AccessibleState state, boolean value) { + if (behaviour.isLightweight()) { + return; + } + AccessibleContext ac = getAccessibleContext(); + if (ac != null) { + AccessibleState oldValue = null; + AccessibleState newValue = null; + if (value) { + newValue = state; + } else { + oldValue = state; + } + ac.firePropertyChange(AccessibleContext.ACCESSIBLE_STATE_PROPERTY, oldValue, + newValue); + } + } + */ + + //???AWT + /* + public void setFocusTraversalKeys(int id, Set<? extends AWTKeyStroke> keystrokes) { + Set<? extends AWTKeyStroke> oldTraversalKeys; + String propName = "FocusTraversalKeys"; //$NON-NLS-1$ + toolkit.lockAWT(); + try { + Integer kId = new Integer(id); + KeyboardFocusManager.checkTraversalKeysID(traversalKeys, kId); + Map<Integer, Set<? extends AWTKeyStroke>> keys = new HashMap<Integer, Set<? extends AWTKeyStroke>>(); + for (int kid : traversalIDs) { + Integer key = new Integer(kid); + keys.put(key, getFocusTraversalKeys(kid)); + } + KeyboardFocusManager.checkKeyStrokes(traversalIDs, keys, kId, keystrokes); + oldTraversalKeys = traversalKeys.get(new Integer(id)); + // put a copy of keystrokes object into map: + Set<? extends AWTKeyStroke> newKeys = keystrokes; + if (keystrokes != null) { + newKeys = new HashSet<AWTKeyStroke>(keystrokes); + } + traversalKeys.put(kId, newKeys); + String direction = ""; //$NON-NLS-1$ + switch (id) { + case KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS: + direction = "forward"; //$NON-NLS-1$ + break; + case KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS: + direction = "backward"; //$NON-NLS-1$ + break; + case KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS: + direction = "upCycle"; //$NON-NLS-1$ + break; + case KeyboardFocusManager.DOWN_CYCLE_TRAVERSAL_KEYS: + direction = "downCycle"; //$NON-NLS-1$ + break; + } + propName = direction + propName; + } finally { + toolkit.unlockAWT(); + } + firePropertyChange(propName, oldTraversalKeys, keystrokes); + } + */ + + /** + * Sets the focus traversal keys state for this component. + * + * @param value true if the focus traversal keys state is enabled, + * false if the focus traversal keys state is disabled. + */ + public void setFocusTraversalKeysEnabled(boolean value) { + boolean oldFocusTraversalKeysEnabled; + toolkit.lockAWT(); + try { + oldFocusTraversalKeysEnabled = focusTraversalKeysEnabled; + focusTraversalKeysEnabled = value; + } finally { + toolkit.unlockAWT(); + } + firePropertyChange("focusTraversalKeysEnabled", oldFocusTraversalKeysEnabled, //$NON-NLS-1$ + focusTraversalKeysEnabled); + } + + //???AWT + /* + public void setFocusable(boolean focusable) { + boolean oldFocusable; + toolkit.lockAWT(); + try { + calledSetFocusable = true; + oldFocusable = this.focusable; + this.focusable = focusable; + if (!focusable) { + moveFocus(); + } + } finally { + toolkit.unlockAWT(); + } + firePropertyChange("focusable", oldFocusable, focusable); //$NON-NLS-1$ + } + + public Font getFont() { + toolkit.lockAWT(); + try { + return (font == null) && (parent != null) ? parent.getFont() : font; + } finally { + toolkit.unlockAWT(); + } + } + */ + + /** + * Sets the font for this Component. + * + * @param f the new font of the Component. + */ + public void setFont(Font f) { + Font oldFont; + toolkit.lockAWT(); + try { + oldFont = font; + setFontImpl(f); + } finally { + toolkit.unlockAWT(); + } + firePropertyChange("font", oldFont, font); //$NON-NLS-1$ + } + + /** + * Sets the font impl. + * + * @param f the new font impl + */ + void setFontImpl(Font f) { + font = f; + invalidate(); + if (isShowing()) { + repaint(); + } + } + + + /** + * Invalidate the component if it inherits the font from the parent. This + * method is overridden in Container. + * + * @return true if the component was invalidated, false otherwise + */ + boolean propagateFont() { + if (font == null) { + invalidate(); + return true; + } + return false; + } + + /** + * Sets the foreground color for this Component. + * + * @param c the new foreground color. + */ + public void setForeground(Color c) { + Color oldFgColor; + toolkit.lockAWT(); + try { + oldFgColor = foreColor; + foreColor = c; + } finally { + toolkit.unlockAWT(); + } + firePropertyChange("foreground", oldFgColor, foreColor); //$NON-NLS-1$ + repaint(); + } + + /** + * Sets the background color for the Component. + * + * @param c the new background color for this component. + */ + public void setBackground(Color c) { + Color oldBkColor; + toolkit.lockAWT(); + try { + oldBkColor = backColor; + backColor = c; + } finally { + toolkit.unlockAWT(); + } + firePropertyChange("background", oldBkColor, backColor); //$NON-NLS-1$ + repaint(); + } + + /** + * Sets the flag for whether paint messages received from the operating + * system should be ignored or not. + * + * @param value true if paint messages received from the operating + * system should be ignored, false otherwise. + */ + public void setIgnoreRepaint(boolean value) { + toolkit.lockAWT(); + try { + ignoreRepaint = value; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets the locale of the component. + * + * @param locale the new Locale. + */ + public void setLocale(Locale locale) { + Locale oldLocale; + toolkit.lockAWT(); + try { + oldLocale = this.locale; + this.locale = locale; + } finally { + toolkit.unlockAWT(); + } + firePropertyChange("locale", oldLocale, locale); //$NON-NLS-1$ + } + + /** + * Sets the location of the Component to the specified point. + * + * @param p the new location of the Component + */ + public void setLocation(Point p) { + toolkit.lockAWT(); + try { + setLocation(p.x, p.y); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets the location of the Component to the specified x, y coordinates. + * + * @param x the x coordinate. + * @param y the y coordinate. + */ + public void setLocation(int x, int y) { + toolkit.lockAWT(); + try { + move(x, y); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets the visibility state of the component. + * + * @param b true if the component is visible, false if the component + * is not shown. + */ + public void setVisible(boolean b) { + // show() & hide() are not deprecated for Window, + // so have to call them from setVisible() + show(b); + } + + /** + * Deprecated: replaced by setVisible(boolean) method. + * + * @deprecated Replaced by setVisible(boolean) method. + */ + @Deprecated + public void show() { + toolkit.lockAWT(); + try { + if (visible) { + return; + } + prepare4HierarchyChange(); + mapToDisplay(true); + validate(); + visible = true; + behaviour.setVisible(true); + postEvent(new ComponentEvent(this, ComponentEvent.COMPONENT_SHOWN)); + //???AWT: finishHierarchyChange(this, parent, 0); + notifyInputMethod(new Rectangle(x, y, w, h)); + //???AWT: invalidateRealParent(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Deprecated: replaced by setVisible(boolean) method. + * + * @param b the visibility's state. + * + * @deprecated Replaced by setVisible(boolean) method. + */ + @Deprecated + public void show(boolean b) { + if (b) { + show(); + } else { + hide(); + } + } + + //???AWT + /* + void transferFocus(int dir) { + Container root = null; + if (this instanceof Container) { + Container cont = (Container) this; + if (cont.isFocusCycleRoot()) { + root = cont.getFocusTraversalRoot(); + } + } + if (root == null) { + root = getFocusCycleRootAncestor(); + } + // transfer focus up cycle if root is unreachable + Component comp = this; + while ((root != null) + && !(root.isFocusCycleRoot() && root.isShowing() && root.isEnabled() && root + .isFocusable())) { + comp = root; + root = root.getFocusCycleRootAncestor(); + } + if (root == null) { + return; + } + FocusTraversalPolicy policy = root.getFocusTraversalPolicy(); + Component nextComp = null; + switch (dir) { + case KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS: + nextComp = policy.getComponentAfter(root, comp); + break; + case KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS: + nextComp = policy.getComponentBefore(root, comp); + break; + } + if (nextComp != null) { + nextComp.requestFocus(false); + } + } + + public void transferFocus() { + toolkit.lockAWT(); + try { + nextFocus(); + } finally { + toolkit.unlockAWT(); + } + } + + public void transferFocusBackward() { + toolkit.lockAWT(); + try { + transferFocus(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS); + } finally { + toolkit.unlockAWT(); + } + } + + public void transferFocusUpCycle() { + toolkit.lockAWT(); + try { + KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager(); + Container root = kfm.getCurrentFocusCycleRoot(); + + if(root == null) { + return; + } + + boolean success = false; + Component nextComp = null; + Container newRoot = root; + do { + nextComp = newRoot instanceof Window ? newRoot.getFocusTraversalPolicy() + .getDefaultComponent(newRoot) : newRoot; + newRoot = newRoot.getFocusCycleRootAncestor(); + if (nextComp == null) { + break; + } + success = nextComp.requestFocusInWindow(); + if (newRoot == null) { + break; + } + kfm.setGlobalCurrentFocusCycleRoot(newRoot); + } while (!success); + if (!success && root != newRoot) { + kfm.setGlobalCurrentFocusCycleRoot(root); + } + } finally { + toolkit.unlockAWT(); + } + } + */ + + /** + * Validates that this component has a valid layout. + */ + public void validate() { + toolkit.lockAWT(); + try { + if (!behaviour.isDisplayable()) { + return; + } + validateImpl(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Validate impl. + */ + void validateImpl() { + valid = true; + } + + /** + * Gets the native window. + * + * @return the native window + */ + NativeWindow getNativeWindow() { + return behaviour.getNativeWindow(); + } + + /** + * Checks whether or not a maximum size is set for the Component. + * + * @return true, if the maximum size is set for the Component, + * false otherwise. + */ + public boolean isMaximumSizeSet() { + toolkit.lockAWT(); + try { + return maximumSize != null; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks whether or not the minimum size is set for the component. + * + * @return true, if the minimum size is set for the component, + * false otherwise. + */ + public boolean isMinimumSizeSet() { + toolkit.lockAWT(); + try { + return minimumSize != null; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Checks whether or not the preferred size is set for the Component. + * + * @return true, if the preferred size is set for the Component, + * false otherwise. + */ + public boolean isPreferredSizeSet() { + toolkit.lockAWT(); + try { + return preferredSize != null; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the maximum size of the Component. + * + * @return the maximum size of the Component. + */ + public Dimension getMaximumSize() { + toolkit.lockAWT(); + try { + return isMaximumSizeSet() ? new Dimension(maximumSize) : new Dimension( + Short.MAX_VALUE, Short.MAX_VALUE); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the minimum size of the Component. + * + * @return the minimum size of the Component. + */ + public Dimension getMinimumSize() { + toolkit.lockAWT(); + try { + return minimumSize(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Deprecated: replaced by getMinimumSize() method. + * + * @return the Dimension. + * + * @deprecated Replaced by getMinimumSize() method. + */ + @Deprecated + public Dimension minimumSize() { + toolkit.lockAWT(); + try { + if (isMinimumSizeSet()) { + return (Dimension)minimumSize.clone(); + } + Dimension defSize = getDefaultMinimumSize(); + if (defSize != null) { + return (Dimension)defSize.clone(); + } + return isDisplayable()? new Dimension(1, 1) : new Dimension(w, h); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets the preferred size of the Component. + * + * @return the preferred size of the Component. + */ + public Dimension getPreferredSize() { + toolkit.lockAWT(); + try { + return preferredSize(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Deprecated: replaced by getPreferredSize() method. + * + * @return the Dimension. + * + * @deprecated Replaced by getPreferredSize() method. + */ + @Deprecated + public Dimension preferredSize() { + toolkit.lockAWT(); + try { + if (isPreferredSizeSet()) { + return new Dimension(preferredSize); + } + Dimension defSize = getDefaultPreferredSize(); + if (defSize != null) { + return new Dimension(defSize); + } + return new Dimension(getMinimumSize()); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets the maximum size of the Component. + * + * @param maximumSize the new maximum size of the Component. + */ + public void setMaximumSize(Dimension maximumSize) { + Dimension oldMaximumSize; + toolkit.lockAWT(); + try { + oldMaximumSize = this.maximumSize; + if (oldMaximumSize != null) { + oldMaximumSize = oldMaximumSize.getSize(); + } + if (this.maximumSize == null) { + if (maximumSize != null) { + this.maximumSize = new Dimension(maximumSize); + } + } else { + if (maximumSize != null) { + this.maximumSize.setSize(maximumSize); + } else { + this.maximumSize = null; + } + } + } finally { + toolkit.unlockAWT(); + } + firePropertyChange("maximumSize", oldMaximumSize, this.maximumSize); //$NON-NLS-1$ + toolkit.lockAWT(); + try { + //???AWT: invalidateRealParent(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets the minimum size of the Component. + * + * @param minimumSize the new minimum size of the Component. + */ + public void setMinimumSize(Dimension minimumSize) { + Dimension oldMinimumSize; + toolkit.lockAWT(); + try { + oldMinimumSize = this.minimumSize; + if (oldMinimumSize != null) { + oldMinimumSize = oldMinimumSize.getSize(); + } + if (this.minimumSize == null) { + if (minimumSize != null) { + this.minimumSize = new Dimension(minimumSize); + } + } else { + if (minimumSize != null) { + this.minimumSize.setSize(minimumSize); + } else { + this.minimumSize = null; + } + } + } finally { + toolkit.unlockAWT(); + } + firePropertyChange("minimumSize", oldMinimumSize, this.minimumSize); //$NON-NLS-1$ + toolkit.lockAWT(); + try { + //???AWT: invalidateRealParent(); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Sets the preferred size of the Component. + * + * @param preferredSize the new preferred size of the Component. + */ + public void setPreferredSize(Dimension preferredSize) { + Dimension oldPreferredSize; + toolkit.lockAWT(); + try { + oldPreferredSize = this.preferredSize; + if (oldPreferredSize != null) { + oldPreferredSize = oldPreferredSize.getSize(); + } + if (this.preferredSize == null) { + if (preferredSize != null) { + this.preferredSize = new Dimension(preferredSize); + } + } else { + if (preferredSize != null) { + this.preferredSize.setSize(preferredSize); + } else { + this.preferredSize = null; + } + } + } finally { + toolkit.unlockAWT(); + } + firePropertyChange("preferredSize", oldPreferredSize, this.preferredSize); //$NON-NLS-1$ + toolkit.lockAWT(); + try { + //???AWT: invalidateRealParent(); + } finally { + toolkit.unlockAWT(); + } + } + + //???AWT + /* + RedrawManager getRedrawManager() { + if (parent == null) { + return null; + } + return parent.getRedrawManager(); + } + */ + + /** + * Checks if is focusability explicitly set. + * + * @return true if component has a focusable peer + */ + //???AWT + /* + boolean isPeerFocusable() { + // The recommendations for Windows and Unix are that + // Canvases, Labels, Panels, Scrollbars, ScrollPanes, Windows, + // and lightweight Components have non-focusable peers, + // and all other Components have focusable peers. + if (this instanceof Canvas || this instanceof Label || this instanceof Panel + || this instanceof Scrollbar || this instanceof ScrollPane + || this instanceof Window || isLightweight()) { + return false; + } + return true; + } + */ + + /** + * @return true if focusability was explicitly set via a call to + * setFocusable() or via overriding isFocusable() or + * isFocusTraversable() + */ + boolean isFocusabilityExplicitlySet() { + return calledSetFocusable || overridenIsFocusable; + } + + /** + * Paints the component and all of its subcomponents. + * + * @param g the Graphics to be used for painting. + */ + public void paintAll(Graphics g) { + toolkit.lockAWT(); + try { + paint(g); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Updates this Component. + * + * @param g the Graphics to be used for updating. + */ + public void update(Graphics g) { + toolkit.lockAWT(); + try { + if (!isLightweight() && !isPrepainter()) { + g.setColor(getBackground()); + g.fillRect(0, 0, w, h); + g.setColor(getForeground()); + } + paint(g); + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Paints this component. + * + * @param g the Graphics to be used for painting. + */ + public void paint(Graphics g) { + toolkit.lockAWT(); + try { + // Just to nothing + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Prepares the component to be painted. + * + * @param g the Graphics to be used for painting. + */ + void prepaint(Graphics g) { + // Just to nothing. For overriding. + } + + /** + * Checks if is prepainter. + * + * @return true, if is prepainter + */ + boolean isPrepainter() { + return false; + } + + /** + * Prepare4 hierarchy change. + */ + void prepare4HierarchyChange() { + if (hierarchyChangingCounter++ == 0) { + wasShowing = isShowing(); + wasDisplayable = isDisplayable(); + prepareChildren4HierarchyChange(); + } + } + + /** + * Prepare children4 hierarchy change. + */ + void prepareChildren4HierarchyChange() { + // To be inherited by Container + } + + //???AWT + /* + void finishHierarchyChange(Component changed, Container changedParent, int ancestorFlags) { + if (--hierarchyChangingCounter == 0) { + int changeFlags = ancestorFlags; + if (wasShowing != isShowing()) { + changeFlags |= HierarchyEvent.SHOWING_CHANGED; + } + if (wasDisplayable != isDisplayable()) { + changeFlags |= HierarchyEvent.DISPLAYABILITY_CHANGED; + } + if (changeFlags > 0) { + postEvent(new HierarchyEvent(this, HierarchyEvent.HIERARCHY_CHANGED, changed, + changedParent, changeFlags)); + } + finishChildrenHierarchyChange(changed, changedParent, ancestorFlags); + } + } + + + void finishChildrenHierarchyChange(Component changed, Container changedParent, + int ancestorFlags) { + // To be inherited by Container + } + + void postHierarchyBoundsEvents(Component changed, int id) { + postEvent(new HierarchyEvent(this, id, changed, null, 0)); + } + */ + + /** + * Spread hierarchy bounds events. + * + * @param changed the changed + * @param id the id + */ + void spreadHierarchyBoundsEvents(Component changed, int id) { + // To be inherited by Container + } + + /** + * Dispatches an event to this component. + * + * @param e the Event. + */ + public final void dispatchEvent(AWTEvent e) { + //???AWT + /* + if (e.isConsumed()) { + return; + } + if (e instanceof PaintEvent) { + toolkit.dispatchAWTEvent(e); + processPaintEvent((PaintEvent) e); + return; + } + KeyboardFocusManager kfm = KeyboardFocusManager.getCurrentKeyboardFocusManager(); + if (!e.dispatchedByKFM && kfm.dispatchEvent(e)) { + return; + } + if (e instanceof KeyEvent) { + KeyEvent ke = (KeyEvent) e; + // consumes KeyEvent which represents a focus traversal key + if (getFocusTraversalKeysEnabled()) { + kfm.processKeyEvent(this, ke); + if (ke.isConsumed()) { + return; + } + } + } + if (inputMethodsEnabled && dispatchToIM && e.isPosted && dispatchEventToIM(e)) { + return; + } + if (e.getID() == WindowEvent.WINDOW_ICONIFIED) { + notifyInputMethod(null); + } + AWTEvent.EventDescriptor descriptor = toolkit.eventTypeLookup.getEventDescriptor(e); + toolkit.dispatchAWTEvent(e); + if (descriptor != null) { + if (isEventEnabled(descriptor.eventMask) + || (getListeners(descriptor.listenerType).length > 0)) { + processEvent(e); + } + // input events can be consumed by user listeners: + if (!e.isConsumed() && ((enabledAWTEvents & descriptor.eventMask) != 0)) { + postprocessEvent(e, descriptor.eventMask); + } + } + postDeprecatedEvent(e); + */ + } + + /** + * Post deprecated event. + * + * @param e the e + */ + private void postDeprecatedEvent(AWTEvent e) { + if (deprecatedEventHandler) { + Event evt = e.getEvent(); + if (evt != null) { + postEvent(evt); + } + } + } + + /** + * Postprocess event. + * + * @param e the e + * @param eventMask the event mask + */ + void postprocessEvent(AWTEvent e, long eventMask) { + toolkit.lockAWT(); + try { + // call system listeners under AWT lock + if (eventMask == AWTEvent.FOCUS_EVENT_MASK) { + preprocessFocusEvent((FocusEvent) e); + } else if (eventMask == AWTEvent.KEY_EVENT_MASK) { + preprocessKeyEvent((KeyEvent) e); + } else if (eventMask == AWTEvent.MOUSE_EVENT_MASK) { + preprocessMouseEvent((MouseEvent) e); + } else if (eventMask == AWTEvent.MOUSE_MOTION_EVENT_MASK) { + preprocessMouseMotionEvent((MouseEvent) e); + } else if (eventMask == AWTEvent.COMPONENT_EVENT_MASK) { + preprocessComponentEvent((ComponentEvent) e); + } else if (eventMask == AWTEvent.MOUSE_WHEEL_EVENT_MASK) { + preprocessMouseWheelEvent((MouseWheelEvent) e); + } else if (eventMask == AWTEvent.INPUT_METHOD_EVENT_MASK) { + preprocessInputMethodEvent((InputMethodEvent) e); + } + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Preprocess input method event. + * + * @param e the e + */ + private void preprocessInputMethodEvent(InputMethodEvent e) { + processInputMethodEventImpl(e, inputMethodListeners.getSystemListeners()); + } + + /** + * Preprocess mouse wheel event. + * + * @param e the e + */ + private void preprocessMouseWheelEvent(MouseWheelEvent e) { + processMouseWheelEventImpl(e, mouseWheelListeners.getSystemListeners()); + } + + /** + * Process mouse wheel event impl. + * + * @param e the e + * @param c the c + */ + private void processMouseWheelEventImpl(MouseWheelEvent e, Collection<MouseWheelListener> c) { + for (MouseWheelListener listener : c) { + switch (e.getID()) { + case MouseEvent.MOUSE_WHEEL: + listener.mouseWheelMoved(e); + break; + } + } + } + + /** + * Preprocess component event. + * + * @param e the e + */ + private void preprocessComponentEvent(ComponentEvent e) { + processComponentEventImpl(e, componentListeners.getSystemListeners()); + } + + /** + * Preprocess mouse motion event. + * + * @param e the e + */ + void preprocessMouseMotionEvent(MouseEvent e) { + processMouseMotionEventImpl(e, mouseMotionListeners.getSystemListeners()); + } + + /** + * Preprocess mouse event. + * + * @param e the e + */ + void preprocessMouseEvent(MouseEvent e) { + processMouseEventImpl(e, mouseListeners.getSystemListeners()); + } + + /** + * Preprocess key event. + * + * @param e the e + */ + void preprocessKeyEvent(KeyEvent e) { + processKeyEventImpl(e, keyListeners.getSystemListeners()); + } + + /** + * Preprocess focus event. + * + * @param e the e + */ + void preprocessFocusEvent(FocusEvent e) { + processFocusEventImpl(e, focusListeners.getSystemListeners()); + } + + /** + * Processes AWTEvent occurred on this component. + * + * @param e the AWTEvent. + */ + protected void processEvent(AWTEvent e) { + long eventMask = toolkit.eventTypeLookup.getEventMask(e); + if (eventMask == AWTEvent.COMPONENT_EVENT_MASK) { + processComponentEvent((ComponentEvent) e); + } else if (eventMask == AWTEvent.FOCUS_EVENT_MASK) { + processFocusEvent((FocusEvent) e); + } else if (eventMask == AWTEvent.KEY_EVENT_MASK) { + processKeyEvent((KeyEvent) e); + } else if (eventMask == AWTEvent.MOUSE_EVENT_MASK) { + processMouseEvent((MouseEvent) e); + } else if (eventMask == AWTEvent.MOUSE_WHEEL_EVENT_MASK) { + processMouseWheelEvent((MouseWheelEvent) e); + } else if (eventMask == AWTEvent.MOUSE_MOTION_EVENT_MASK) { + processMouseMotionEvent((MouseEvent) e); + } else if (eventMask == AWTEvent.HIERARCHY_EVENT_MASK) { + processHierarchyEvent((HierarchyEvent) e); + } else if (eventMask == AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK) { + processHierarchyBoundsEvent((HierarchyEvent) e); + } else if (eventMask == AWTEvent.INPUT_METHOD_EVENT_MASK) { + processInputMethodEvent((InputMethodEvent) e); + } + } + + /** + * Gets an array of all listener's objects based on the specified + * listener type and registered to this Component. + * + * @param listenerType the listener type. + * + * @return an array of all listener's objects based on the specified + * listener type and registered to this Component. + */ + @SuppressWarnings("unchecked") + public <T extends EventListener> T[] getListeners(Class<T> listenerType) { + if (ComponentListener.class.isAssignableFrom(listenerType)) { + return (T[]) getComponentListeners(); + } else if (FocusListener.class.isAssignableFrom(listenerType)) { + return (T[]) getFocusListeners(); + } else if (HierarchyBoundsListener.class.isAssignableFrom(listenerType)) { + return (T[]) getHierarchyBoundsListeners(); + } else if (HierarchyListener.class.isAssignableFrom(listenerType)) { + return (T[]) getHierarchyListeners(); + } else if (InputMethodListener.class.isAssignableFrom(listenerType)) { + return (T[]) getInputMethodListeners(); + } else if (KeyListener.class.isAssignableFrom(listenerType)) { + return (T[]) getKeyListeners(); + } else if (MouseWheelListener.class.isAssignableFrom(listenerType)) { + return (T[]) getMouseWheelListeners(); + } else if (MouseMotionListener.class.isAssignableFrom(listenerType)) { + return (T[]) getMouseMotionListeners(); + } else if (MouseListener.class.isAssignableFrom(listenerType)) { + return (T[]) getMouseListeners(); + } else if (PropertyChangeListener.class.isAssignableFrom(listenerType)) { + return (T[]) getPropertyChangeListeners(); + } + return (T[]) Array.newInstance(listenerType, 0); + } + + /** + * Process paint event. + * + * @param event the event + */ + private void processPaintEvent(PaintEvent event) { + if (redrawManager == null) { + return; + } + Rectangle clipRect = event.getUpdateRect(); + if ((clipRect.width <= 0) || (clipRect.height <= 0)) { + return; + } + Graphics g = getGraphics(); + if (g == null) { + return; + } + initGraphics(g, event); + if (!getIgnoreRepaint()) { + if (event.getID() == PaintEvent.PAINT) { + paint(g); + } else { + update(g); + } + } + g.dispose(); + } + + /** + * Inits the graphics. + * + * @param g the g + * @param e the e + */ + void initGraphics(Graphics g, PaintEvent e) { + Rectangle clip = e.getUpdateRect(); + if (clip instanceof ClipRegion) { + g.setClip(((ClipRegion) clip).getClip()); + } else { + g.setClip(clip); + } + if (isPrepainter()) { + prepaint(g); + } else if (!isLightweight() && (e.getID() == PaintEvent.PAINT)) { + g.setColor(getBackground()); + g.fillRect(0, 0, w, h); + } + g.setFont(getFont()); + g.setColor(getForeground()); + } + + /** + * Enables the events with the specified event mask to be delivered to + * this component. + * + * @param eventsToEnable the events mask which specifies the types + * of events to enable. + */ + protected final void enableEvents(long eventsToEnable) { + toolkit.lockAWT(); + try { + enabledEvents |= eventsToEnable; + deprecatedEventHandler = false; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Enable awt events. + * + * @param eventsToEnable the events to enable + */ + private void enableAWTEvents(long eventsToEnable) { + enabledAWTEvents |= eventsToEnable; + } + + /** + * Disables the events with types specified by the specified event mask + * from being delivered to this component. + * + * @param eventsToDisable the event mask specifying the event types. + */ + protected final void disableEvents(long eventsToDisable) { + toolkit.lockAWT(); + try { + enabledEvents &= ~eventsToDisable; + } finally { + toolkit.unlockAWT(); + } + } + + /* + * For use in MouseDispatcher only. Really it checks not only mouse events. + */ + /** + * Checks if is mouse event enabled. + * + * @param eventMask the event mask + * + * @return true, if is mouse event enabled + */ + boolean isMouseEventEnabled(long eventMask) { + return (isEventEnabled(eventMask) || (enabledAWTEvents & eventMask) != 0); + } + + /** + * Checks if is event enabled. + * + * @param eventMask the event mask + * + * @return true, if is event enabled + */ + boolean isEventEnabled(long eventMask) { + return ((enabledEvents & eventMask) != 0); + } + + /** + * Enables or disables input method support for this component. + * + * @param enable true to enable input method support, false to disable it. + */ + public void enableInputMethods(boolean enable) { + toolkit.lockAWT(); + try { + if (!enable) { + removeNotifyInputContext(); + } + inputMethodsEnabled = enable; + } finally { + toolkit.unlockAWT(); + } + } + + /** + * Gets an array of all component's listeners registered for this + * component. + * + * @return an array of all component's listeners registered for this + * component. + */ + public ComponentListener[] getComponentListeners() { + return componentListeners.getUserListeners(new ComponentListener[0]); + } + + /** + * Adds the specified component listener to the Component for receiving + * component's event. + * + * @param l the ComponentListener. + */ + public void addComponentListener(ComponentListener l) { + componentListeners.addUserListener(l); + } + + /** + * Removes the component listener registered for this Component. + * + * @param l the ComponentListener. + */ + public void removeComponentListener(ComponentListener l) { + componentListeners.removeUserListener(l); + } + + /** + * Processes a component event that has occurred on this component + * by dispatching them to any registered ComponentListener objects. + * + * @param e the ComponentEvent. + */ + protected void processComponentEvent(ComponentEvent e) { + processComponentEventImpl(e, componentListeners.getUserListeners()); + } + + /** + * Process component event impl. + * + * @param e the e + * @param c the c + */ + private void processComponentEventImpl(ComponentEvent e, Collection<ComponentListener> c) { + for (ComponentListener listener : c) { + switch (e.getID()) { + case ComponentEvent.COMPONENT_HIDDEN: + listener.componentHidden(e); + break; + case ComponentEvent.COMPONENT_MOVED: + listener.componentMoved(e); + break; + case ComponentEvent.COMPONENT_RESIZED: + listener.componentResized(e); + break; + case ComponentEvent.COMPONENT_SHOWN: + listener.componentShown(e); + break; + } + } + } + + /** + * Gets an array of focus listeners registered for this Component. + * + * @return the array of focus listeners registered for this Component. + */ + public FocusListener[] getFocusListeners() { + return focusListeners.getUserListeners(new FocusListener[0]); + } + + /** + * Adds the specified focus listener to the Component for receiving + * focus events. + * + * @param l the FocusListener. + */ + public void addFocusListener(FocusListener l) { + focusListeners.addUserListener(l); + } + + /** + * Adds the awt focus listener. + * + * @param l the l + */ + void addAWTFocusListener(FocusListener l) { + enableAWTEvents(AWTEvent.FOCUS_EVENT_MASK); + focusListeners.addSystemListener(l); + } + + /** + * Removes the focus listener registered for this Component. + * + * @param l the FocusListener. + */ + public void removeFocusListener(FocusListener l) { + focusListeners.removeUserListener(l); + } + + /** + * Processes a FocusEvent that has occurred on this component + * by dispatching it to the registered listeners. + * + * @param e the FocusEvent. + */ + protected void processFocusEvent(FocusEvent e) { + processFocusEventImpl(e, focusListeners.getUserListeners()); + } + + /** + * Process focus event impl. + * + * @param e the e + * @param c the c + */ + private void processFocusEventImpl(FocusEvent e, Collection<FocusListener> c) { + for (FocusListener listener : c) { + switch (e.getID()) { + case FocusEvent.FOCUS_GAINED: + listener.focusGained(e); + break; + case FocusEvent.FOCUS_LOST: + listener.focusLost(e); + break; + } + } + } + + /** + * Gets an array of registered HierarchyListeners for + * this Component. + * + * @return an array of registered HierarchyListeners for + * this Component. + */ + public HierarchyListener[] getHierarchyListeners() { + return hierarchyListeners.getUserListeners(new HierarchyListener[0]); + } + + /** + * Adds the specified hierarchy listener. + * + * @param l the HierarchyListener. + */ + public void addHierarchyListener(HierarchyListener l) { + hierarchyListeners.addUserListener(l); + } + + /** + * Removes the hierarchy listener registered for this component. + * + * @param l the HierarchyListener. + */ + public void removeHierarchyListener(HierarchyListener l) { + hierarchyListeners.removeUserListener(l); + } + + /** + * Processes a hierarchy event that has occurred on this component + * by dispatching it to the registered listeners. + * + * @param e the HierarchyEvent. + */ + protected void processHierarchyEvent(HierarchyEvent e) { + for (HierarchyListener listener : hierarchyListeners.getUserListeners()) { + switch (e.getID()) { + case HierarchyEvent.HIERARCHY_CHANGED: + listener.hierarchyChanged(e); + break; + } + } + } + + /** + * Gets an array of HierarchyBoundsListener objects registered + * to this Component. + * + * @return an array of HierarchyBoundsListener objects. + */ + public HierarchyBoundsListener[] getHierarchyBoundsListeners() { + return hierarchyBoundsListeners.getUserListeners(new HierarchyBoundsListener[0]); + } + + /** + * Adds the specified hierarchy bounds listener. + * + * @param l the HierarchyBoundsListener. + */ + public void addHierarchyBoundsListener(HierarchyBoundsListener l) { + hierarchyBoundsListeners.addUserListener(l); + } + + /** + * Removes the hierarchy bounds listener registered for this Component. + * + * @param l the HierarchyBoundsListener. + */ + public void removeHierarchyBoundsListener(HierarchyBoundsListener l) { + hierarchyBoundsListeners.removeUserListener(l); + } + + /** + * Processes a hierarchy bounds event that has occurred on this component + * by dispatching it to the registered listeners. + * + * @param e the HierarchyBoundsEvent. + */ + protected void processHierarchyBoundsEvent(HierarchyEvent e) { + for (HierarchyBoundsListener listener : hierarchyBoundsListeners.getUserListeners()) { + switch (e.getID()) { + case HierarchyEvent.ANCESTOR_MOVED: + listener.ancestorMoved(e); + break; + case HierarchyEvent.ANCESTOR_RESIZED: + listener.ancestorResized(e); + break; + } + } + } + + /** + * Gets an array of the key listeners registered to the Component. + * + * @return an array of the key listeners registered to the Component. + */ + public KeyListener[] getKeyListeners() { + return keyListeners.getUserListeners(new KeyListener[0]); + } + + /** + * Adds the specified key listener. + * + * @param l the KeyListener. + */ + public void addKeyListener(KeyListener l) { + keyListeners.addUserListener(l); + } + + /** + * Adds the awt key listener. + * + * @param l the l + */ + void addAWTKeyListener(KeyListener l) { + enableAWTEvents(AWTEvent.KEY_EVENT_MASK); + keyListeners.addSystemListener(l); + } + + /** + * Removes the key listener registered for this Component. + * + * @param l the KeyListener. + */ + public void removeKeyListener(KeyListener l) { + keyListeners.removeUserListener(l); + } + + /** + * Processes a key event that has occurred on this component + * by dispatching it to the registered listeners. + * + * @param e the KeyEvent. + */ + protected void processKeyEvent(KeyEvent e) { + processKeyEventImpl(e, keyListeners.getUserListeners()); + } + + /** + * Process key event impl. + * + * @param e the e + * @param c the c + */ + private void processKeyEventImpl(KeyEvent e, Collection<KeyListener> c) { + for (KeyListener listener : c) { + switch (e.getID()) { + case KeyEvent.KEY_PRESSED: + listener.keyPressed(e); + break; + case KeyEvent.KEY_RELEASED: + listener.keyReleased(e); + break; + case KeyEvent.KEY_TYPED: + listener.keyTyped(e); + break; + } + } + } + + /** + * Gets an array of the mouse listeners registered to the Component. + * + * @return an array of the mouse listeners registered to the Component. + */ + public MouseListener[] getMouseListeners() { + return mouseListeners.getUserListeners(new MouseListener[0]); + } + + /** + * Adds the specified mouse listener. + * + * @param l the MouseListener. + */ + public void addMouseListener(MouseListener l) { + mouseListeners.addUserListener(l); + } + + /** + * Adds the awt mouse listener. + * + * @param l the l + */ + void addAWTMouseListener(MouseListener l) { + enableAWTEvents(AWTEvent.MOUSE_EVENT_MASK); + mouseListeners.addSystemListener(l); + } + + /** + * Adds the awt mouse motion listener. + * + * @param l the l + */ + void addAWTMouseMotionListener(MouseMotionListener l) { + enableAWTEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK); + mouseMotionListeners.addSystemListener(l); + } + + /** + * Adds the awt component listener. + * + * @param l the l + */ + void addAWTComponentListener(ComponentListener l) { + enableAWTEvents(AWTEvent.COMPONENT_EVENT_MASK); + componentListeners.addSystemListener(l); + } + + /** + * Adds the awt input method listener. + * + * @param l the l + */ + void addAWTInputMethodListener(InputMethodListener l) { + enableAWTEvents(AWTEvent.INPUT_METHOD_EVENT_MASK); + inputMethodListeners.addSystemListener(l); + } + + /** + * Adds the awt mouse wheel listener. + * + * @param l the l + */ + void addAWTMouseWheelListener(MouseWheelListener l) { + enableAWTEvents(AWTEvent.MOUSE_WHEEL_EVENT_MASK); + mouseWheelListeners.addSystemListener(l); + } + + /** + * Removes the mouse listener registered for this Component. + * + * @param l the MouseListener. + */ + public void removeMouseListener(MouseListener l) { + mouseListeners.removeUserListener(l); + } + + /** + * Processes a mouse event that has occurred on this component + * by dispatching it to the registered listeners. + * + * @param e the MouseEvent. + */ + protected void processMouseEvent(MouseEvent e) { + processMouseEventImpl(e, mouseListeners.getUserListeners()); + } + + /** + * Process mouse event impl. + * + * @param e the e + * @param c the c + */ + private void processMouseEventImpl(MouseEvent e, Collection<MouseListener> c) { + for (MouseListener listener : c) { + switch (e.getID()) { + case MouseEvent.MOUSE_CLICKED: + listener.mouseClicked(e); + break; + case MouseEvent.MOUSE_ENTERED: + listener.mouseEntered(e); + break; + case MouseEvent.MOUSE_EXITED: + listener.mouseExited(e); + break; + case MouseEvent.MOUSE_PRESSED: + listener.mousePressed(e); + break; + case MouseEvent.MOUSE_RELEASED: + listener.mouseReleased(e); + break; + } + } + } + + /** + * Process mouse motion event impl. + * + * @param e the e + * @param c the c + */ + private void processMouseMotionEventImpl(MouseEvent e, Collection<MouseMotionListener> c) { + for (MouseMotionListener listener : c) { + switch (e.getID()) { + case MouseEvent.MOUSE_DRAGGED: + listener.mouseDragged(e); + break; + case MouseEvent.MOUSE_MOVED: + listener.mouseMoved(e); + break; + } + } + } + + /** + * Gets an array of the mouse motion listeners registered to + * the Component. + * + * @return an array of the MouseMotionListeners registered to + * the Component. + */ + public MouseMotionListener[] getMouseMotionListeners() { + return mouseMotionListeners.getUserListeners(new MouseMotionListener[0]); + } + + /** + * Adds the specified mouse motion listener. + * + * @param l the MouseMotionListener. + */ + public void addMouseMotionListener(MouseMotionListener l) { + mouseMotionListeners.addUserListener(l); + } + + /** + * Removes the mouse motion listener registered for this component. + * + * @param l the MouseMotionListener. + */ + public void removeMouseMotionListener(MouseMotionListener l) { + mouseMotionListeners.removeUserListener(l); + } + + /** + * Processes a mouse motion event that has occurred on this component + * by dispatching it to the registered listeners. + * + * @param e the MouseEvent. + */ + protected void processMouseMotionEvent(MouseEvent e) { + processMouseMotionEventImpl(e, mouseMotionListeners.getUserListeners()); + } + + /** + * Gets an array of the mouse wheel listeners registered to + * the Component. + * + * @return an array of the MouseWheelListeners registered to + * the Component. + */ + public MouseWheelListener[] getMouseWheelListeners() { + return mouseWheelListeners.getUserListeners(new MouseWheelListener[0]); + } + + /** + * Adds the specified mouse wheel listener. + * + * @param l the MouseWheelListener. + */ + public void addMouseWheelListener(MouseWheelListener l) { + mouseWheelListeners.addUserListener(l); + } + + /** + * Removes the mouse wheel listener registered for this component. + * + * @param l the MouseWheelListener. + */ + public void removeMouseWheelListener(MouseWheelListener l) { + mouseWheelListeners.removeUserListener(l); + } + + /** + * Processes a mouse wheel event that has occurred on this component + * by dispatching it to the registered listeners. + * + * @param e the MouseWheelEvent. + */ + protected void processMouseWheelEvent(MouseWheelEvent e) { + processMouseWheelEventImpl(e, mouseWheelListeners.getUserListeners()); + } + + /** + * Gets an array of the InputMethodListener listeners + * registered to the Component. + * + * @return an array of the InputMethodListener listeners + * registered to the Component. + */ + public InputMethodListener[] getInputMethodListeners() { + return inputMethodListeners.getUserListeners(new InputMethodListener[0]); + } + + /** + * Adds the specified input method listener. + * + * @param l the InputMethodListener. + */ + public void addInputMethodListener(InputMethodListener l) { + inputMethodListeners.addUserListener(l); + } + + /** + * Removes the input method listener registered for this component. + * + * @param l the InputMethodListener. + */ + public void removeInputMethodListener(InputMethodListener l) { + inputMethodListeners.removeUserListener(l); + } + + /** + * Processes an input method event that has occurred on this component + * by dispatching it to the registered listeners. + * + * @param e the InputMethodEvent. + */ + protected void processInputMethodEvent(InputMethodEvent e) { + processInputMethodEventImpl(e, inputMethodListeners.getUserListeners()); + } + + /** + * Process input method event impl. + * + * @param e the e + * @param c the c + */ + private void processInputMethodEventImpl(InputMethodEvent e, + Collection<InputMethodListener> c) { + for (InputMethodListener listener : c) { + switch (e.getID()) { + case InputMethodEvent.CARET_POSITION_CHANGED: + listener.caretPositionChanged(e); + break; + case InputMethodEvent.INPUT_METHOD_TEXT_CHANGED: + listener.inputMethodTextChanged(e); + break; + } + } + } + + //???AWT + /* + public Point getMousePosition() throws HeadlessException { + Point absPointerPos = MouseInfo.getPointerInfo().getLocation(); + Window winUnderPtr = toolkit.dispatcher.mouseDispatcher.findWindowAt(absPointerPos); + Point pointerPos = MouseDispatcher.convertPoint(null, absPointerPos, winUnderPtr); + boolean isUnderPointer = false; + if (winUnderPtr == null) { + return null; + } + isUnderPointer = winUnderPtr.isComponentAt(this, pointerPos); + if (isUnderPointer) { + return MouseDispatcher.convertPoint(null, absPointerPos, this); + } + return null; + } + */ + + /** + * Set native caret at the given position <br> + * Note: this method takes AWT lock inside because it walks through the + * component hierarchy. + * + * @param x the x + * @param y the y + */ + void setCaretPos(final int x, final int y) { + Runnable r = new Runnable() { + public void run() { + toolkit.lockAWT(); + try { + setCaretPosImpl(x, y); + } finally { + toolkit.unlockAWT(); + } + } + }; + if (Thread.currentThread() instanceof EventDispatchThread) { + r.run(); + } else { + toolkit.getSystemEventQueueImpl().postEvent(new InvocationEvent(this, r)); + } + } + + /** + * This method should be called only at event dispatch thread. + * + * @param x the x + * @param y the y + */ + void setCaretPosImpl(int x, int y) { + Component c = this; + while ((c != null) && c.behaviour.isLightweight()) { + x += c.x; + y += c.y; + //???AWT: c = c.getParent(); + } + if (c == null) { + return; + } + //???AWT + /* + if (c instanceof Window) { + Insets insets = c.getNativeInsets(); + x -= insets.left; + y -= insets.top; + } + toolkit.getWindowFactory().setCaretPosition(x, y); + */ + } + + // to be overridden in standard components such as Button and List + /** + * Gets the default minimum size. + * + * @return the default minimum size + */ + Dimension getDefaultMinimumSize() { + return null; + } + + // to be overridden in standard components such as Button and List + /** + * Gets the default preferred size. + * + * @return the default preferred size + */ + Dimension getDefaultPreferredSize() { + return null; + } + + // to be overridden in standard components such as Button and List + /** + * Reset default size. + */ + void resetDefaultSize() { + } + + //???AWT + /* + ComponentBehavior createBehavior() { + return new LWBehavior(this); + } + */ + + /** + * Gets the default background. + * + * @return the default background + */ + Color getDefaultBackground() { + //???AWT: return getWindowAncestor().getDefaultBackground(); + return getBackground(); + } + + /** + * Gets the default foreground. + * + * @return the default foreground + */ + Color getDefaultForeground() { + //???AWT return getWindowAncestor().getDefaultForeground(); + return getForeground(); + } + + /** + * Called when native resource for this component is created (for + * heavyweights only). + * + * @param win the win + */ + void nativeWindowCreated(NativeWindow win) { + // to be overridden + } + + /** + * Determine the component's area hidden behind the windows that have higher + * Z-order, including windows of other applications. + * + * @param image the image + * @param destLocation the dest location + * @param destSize the dest size + * @param source the source + * + * @return the calculated region, or null if it cannot be determined + */ + //???AWT + /* + MultiRectArea getObscuredRegion(Rectangle part) { + if (!visible || parent == null || !parent.visible) { + return null; + } + Rectangle r = new Rectangle(0, 0, w, h); + if (part != null) { + r = r.intersection(part); + } + if (r.isEmpty()) { + return null; + } + r.translate(x, y); + MultiRectArea ret = parent.getObscuredRegion(r); + if (ret != null) { + parent.addObscuredRegions(ret, this); + ret.translate(-x, -y); + ret.intersect(new Rectangle(0, 0, w, h)); + } + return ret; + } + */ + + //???AWT + /* + private void readObject(ObjectInputStream stream) throws IOException, + ClassNotFoundException { + stream.defaultReadObject(); + FieldsAccessor accessor = new FieldsAccessor(Component.class, this); + accessor.set("toolkit", Toolkit.getDefaultToolkit()); //$NON-NLS-1$ + accessor.set("behaviour", createBehavior()); //$NON-NLS-1$ + accessor.set("componentLock", new Object()); // $NON-LOCK-1$ //$NON-NLS-1$ + } + */ + + final void onDrawImage(Image image, Point destLocation, Dimension destSize, Rectangle source) { + ImageParameters imageParams; + if (updatedImages == null) { + updatedImages = new HashMap<Image, ImageParameters>(); + } + imageParams = updatedImages.get(image); + if (imageParams == null) { + imageParams = new ImageParameters(); + updatedImages.put(image, imageParams); + } + imageParams.addDrawing(destLocation, destSize, source); + } + + public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h) { + toolkit.lockAWT(); + try { + boolean done = false; + if ((infoflags & (ALLBITS | FRAMEBITS)) != 0) { + done = true; + } else if ((infoflags & SOMEBITS) != 0 && incrementalImageUpdate) { + done = true; + } + if (done) { + repaint(); + } + return (infoflags & (ABORT | ALLBITS)) == 0; + } finally { + toolkit.unlockAWT(); + } + } + + //???AWT + /* + private void invalidateRealParent() { + Container realParent = getRealParent(); + if ((realParent != null) && realParent.isValid()) { + realParent.invalidate(); + } + } + */ + + /** + * The Class ImageParameters. + */ + private class ImageParameters { + + /** The drawing params. */ + private final LinkedList<DrawingParameters> drawingParams = new LinkedList<DrawingParameters>(); + + /** The size. */ + Dimension size = new Dimension(Component.this.w, Component.this.h); + + /** + * Adds the drawing. + * + * @param destLocation the dest location + * @param destSize the dest size + * @param source the source + */ + void addDrawing(Point destLocation, Dimension destSize, Rectangle source) { + drawingParams.add(new DrawingParameters(destLocation, destSize, source)); + } + + /** + * Drawing parameters iterator. + * + * @return the iterator< drawing parameters> + */ + Iterator<DrawingParameters> drawingParametersIterator() { + return drawingParams.iterator(); + } + + /** + * The Class DrawingParameters. + */ + class DrawingParameters { + + /** The dest location. */ + Point destLocation; + + /** The dest size. */ + Dimension destSize; + + /** The source. */ + Rectangle source; + + /** + * Instantiates a new drawing parameters. + * + * @param destLocation the dest location + * @param destSize the dest size + * @param source the source + */ + DrawingParameters(Point destLocation, Dimension destSize, Rectangle source) { + this.destLocation = new Point(destLocation); + if (destSize != null) { + this.destSize = new Dimension(destSize); + } else { + this.destSize = null; + } + if (source != null) { + this.source = new Rectangle(source); + } else { + this.source = null; + } + } + } + } + + /** + * TextComponent support. + * + * @param e the e + * + * @return true, if dispatch event to im + */ + //???AWT + /* + private TextKit textKit = null; + + TextKit getTextKit() { + return textKit; + } + + void setTextKit(TextKit kit) { + textKit = kit; + } + */ + + /** + * TextField support + */ + //???AWT + /* + private TextFieldKit textFieldKit = null; + + TextFieldKit getTextFieldKit() { + return textFieldKit; + } + + void setTextFieldKit(TextFieldKit kit) { + textFieldKit = kit; + } + */ + + /** + * Dispatches input & focus events to input method + * context. + * @param e event to pass to InputContext.dispatchEvent() + * @return true if event was consumed by IM, false otherwise + */ + private boolean dispatchEventToIM(AWTEvent e) { + InputContext ic = getInputContext(); + if (ic == null) { + return false; + } + int id = e.getID(); + boolean isInputEvent = ((id >= KeyEvent.KEY_FIRST) && (id <= KeyEvent.KEY_LAST)) + || ((id >= MouseEvent.MOUSE_FIRST) && (id <= MouseEvent.MOUSE_LAST)); + if (((id >= FocusEvent.FOCUS_FIRST) && (id <= FocusEvent.FOCUS_LAST)) || isInputEvent) { + ic.dispatchEvent(e); + } + return e.isConsumed(); + } +} |