From: <ls...@us...> - 2008-03-16 20:25:31
|
Revision: 3856 http://jnode.svn.sourceforge.net/jnode/?rev=3856&view=rev Author: lsantha Date: 2008-03-16 13:25:30 -0700 (Sun, 16 Mar 2008) Log Message: ----------- OpenJDK AWT & Swing integration. Removed Paths: ------------- trunk/core/src/classpath/java/java/awt/Event.java trunk/core/src/classpath/java/java/awt/EventDispatchThread.java trunk/core/src/classpath/java/java/awt/EventQueue.java trunk/core/src/classpath/java/java/awt/KeyboardFocusManager.java Deleted: trunk/core/src/classpath/java/java/awt/Event.java =================================================================== --- trunk/core/src/classpath/java/java/awt/Event.java 2008-03-16 20:23:32 UTC (rev 3855) +++ trunk/core/src/classpath/java/java/awt/Event.java 2008-03-16 20:25:30 UTC (rev 3856) @@ -1,263 +0,0 @@ -/* Copyright (C) 1999, 2000, 2002 Free Software Foundation - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - - -package java.awt; - -import java.awt.event.KeyEvent; - -/** - * Written using on-line Java Platform 1.2 API Specification, as well - * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). - * Status: Believed complete and correct. - */ - -public class Event implements java.io.Serializable -{ - static final long serialVersionUID = 5488922509400504703L; - - public static final int SHIFT_MASK = 1; - public static final int CTRL_MASK = 2; - public static final int META_MASK = 4; - public static final int ALT_MASK = 8; - - public static final int ACTION_EVENT = 1001; - public static final int BACK_SPACE = 8; - public static final int CAPS_LOCK = 1022; - public static final int DELETE = 127; - public static final int DOWN = 1005; - public static final int END = 1001; - public static final int ENTER = 10; - public static final int ESCAPE = 27; - public static final int F1 = 1008; - public static final int F10 = 1017; - public static final int F11 = 1018; - public static final int F12 = 1019; - public static final int F2 = 1009; - public static final int F3 = 1010; - public static final int F4 = 1011; - public static final int F5 = 1012; - public static final int F6 = 1013; - public static final int F7 = 1014; - public static final int F8 = 1015; - public static final int F9 = 1016; - public static final int GOT_FOCUS = 1004; - public static final int HOME = 1000; - public static final int INSERT = 1025; - public static final int KEY_ACTION = 403; - public static final int KEY_ACTION_RELEASE = 404; - public static final int KEY_PRESS = 401; - public static final int KEY_RELEASE = 402; - public static final int LEFT = 1006; - public static final int LIST_DESELECT = 702; - public static final int LIST_SELECT = 701; - public static final int LOAD_FILE = 1002; - public static final int LOST_FOCUS = 1005; - public static final int MOUSE_DOWN = 501; - public static final int MOUSE_DRAG = 506; - public static final int MOUSE_ENTER = 504; - public static final int MOUSE_EXIT = 505; - public static final int MOUSE_MOVE = 503; - public static final int MOUSE_UP = 502; - public static final int NUM_LOCK = 1023; - public static final int PAUSE = 1024; - public static final int PGDN = 1003; - public static final int PGUP = 1002; - public static final int PRINT_SCREEN = 1020; - public static final int RIGHT = 1007; - public static final int SAVE_FILE = 1003; - public static final int SCROLL_ABSOLUTE = 605; - public static final int SCROLL_BEGIN = 606; - public static final int SCROLL_END = 607; - public static final int SCROLL_LINE_DOWN = 602; - public static final int SCROLL_LINE_UP = 601; - public static final int SCROLL_LOCK = 1021; - public static final int SCROLL_PAGE_DOWN = 604; - public static final int SCROLL_PAGE_UP = 603; - public static final int TAB = 9; - public static final int UP = 1004; - public static final int WINDOW_DEICONIFY = 204; - public static final int WINDOW_DESTROY = 201; - public static final int WINDOW_EXPOSE = 202; - public static final int WINDOW_ICONIFY = 203; - public static final int WINDOW_MOVED = 205; - - public Object arg; - public int clickCount; - boolean consumed; // Required by serialization spec. - public Event evt; - public int id; - public int key; - public int modifiers; - public Object target; - public long when; - public int x; - public int y; - - public Event (Object target, int id, Object arg) - { - this.id = id; - this.target = target; - this.arg = arg; - } - - public Event (Object target, long when, int id, int x, int y, int key, - int modifiers) - { - this.target = target; - this.when = when; - this.id = id; - this.x = x; - this.y = y; - this.key = key; - this.modifiers = modifiers; - } - - public Event (Object target, long when, int id, int x, int y, int key, - int modifiers, Object arg) - { - this (target, when, id, x, y, key, modifiers); - this.arg = arg; - } - - public boolean controlDown () - { - return ((modifiers & CTRL_MASK) == 0 ? false : true); - } - - public boolean metaDown () - { - return ((modifiers & META_MASK) == 0 ? false : true); - } - - protected String paramString () - { - return "id=" + id + ",x=" + x + ",y=" + y - + ",target=" + target + ",arg=" + arg; - } - - public boolean shiftDown() - { - return ((modifiers & SHIFT_MASK) == 0 ? false : true); - } - - public String toString() - { - return getClass().getName() + "[" + paramString() + "]"; - } - - public void translate (int x, int y) - { - this.x += x; - this.y += y; - } - - //jnode openjdk -/* - * <b>NOTE:</b> The <code>Event</code> class is obsolete and is - * available only for backwards compatilibility. It has been replaced - * by the <code>AWTEvent</code> class and its subclasses. - * <p> - * Returns the integer key-code associated with the key in this event, - * as described in java.awt.Event. - */ -static int getOldEventKey(KeyEvent e) { - int keyCode = e.getKeyCode(); - for (int i = 0; i < actionKeyCodes.length; i++) { - if (actionKeyCodes[i][0] == keyCode) { - return actionKeyCodes[i][1]; - } - } - return (int)e.getKeyChar(); -} - -/* table for mapping old Event action keys to KeyEvent virtual keys. */ -private static final int actionKeyCodes[][] = { -/* virtual key action key */ - { KeyEvent.VK_HOME, Event.HOME }, - { KeyEvent.VK_END, Event.END }, - { KeyEvent.VK_PAGE_UP, Event.PGUP }, - { KeyEvent.VK_PAGE_DOWN, Event.PGDN }, - { KeyEvent.VK_UP, Event.UP }, - { KeyEvent.VK_DOWN, Event.DOWN }, - { KeyEvent.VK_LEFT, Event.LEFT }, - { KeyEvent.VK_RIGHT, Event.RIGHT }, - { KeyEvent.VK_F1, Event.F1 }, - { KeyEvent.VK_F2, Event.F2 }, - { KeyEvent.VK_F3, Event.F3 }, - { KeyEvent.VK_F4, Event.F4 }, - { KeyEvent.VK_F5, Event.F5 }, - { KeyEvent.VK_F6, Event.F6 }, - { KeyEvent.VK_F7, Event.F7 }, - { KeyEvent.VK_F8, Event.F8 }, - { KeyEvent.VK_F9, Event.F9 }, - { KeyEvent.VK_F10, Event.F10 }, - { KeyEvent.VK_F11, Event.F11 }, - { KeyEvent.VK_F12, Event.F12 }, - { KeyEvent.VK_PRINTSCREEN, Event.PRINT_SCREEN }, - { KeyEvent.VK_SCROLL_LOCK, Event.SCROLL_LOCK }, - { KeyEvent.VK_CAPS_LOCK, Event.CAPS_LOCK }, - { KeyEvent.VK_NUM_LOCK, Event.NUM_LOCK }, - { KeyEvent.VK_PAUSE, Event.PAUSE }, - { KeyEvent.VK_INSERT, Event.INSERT } -}; - - /* - * <b>NOTE:</b> The <code>Event</code> class is obsolete and is - * available only for backwards compatilibility. It has been replaced - * by the <code>AWTEvent</code> class and its subclasses. - * <p> - * Returns a new KeyEvent char which corresponds to the int key - * of this old event. - */ - char getKeyEventChar() { - for (int i = 0; i < actionKeyCodes.length; i++) { - if (actionKeyCodes[i][1] == key) { - return KeyEvent.CHAR_UNDEFINED; - } - } - return (char)key; - } - - /** - * <b>NOTE:</b> The <code>Event</code> class is obsolete and is - * available only for backwards compatilibility. It has been replaced - * by the <code>AWTEvent</code> class and its subclasses. - */ - boolean isConsumed() { - return consumed; - } -} Deleted: trunk/core/src/classpath/java/java/awt/EventDispatchThread.java =================================================================== --- trunk/core/src/classpath/java/java/awt/EventDispatchThread.java 2008-03-16 20:23:32 UTC (rev 3855) +++ trunk/core/src/classpath/java/java/awt/EventDispatchThread.java 2008-03-16 20:25:30 UTC (rev 3856) @@ -1,117 +0,0 @@ -/* EventDispatchThread.java - - Copyright (C) 2000, 2002, 2004 Free Software Foundation - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - -package java.awt; - -/** - * @author Bryce McKinlay - * @status believed complete, but untested. - */ -class EventDispatchThread extends Thread -{ - /** - * The default priority when no property has been set. - */ - private static final int DEFAULT_PRIORITY = NORM_PRIORITY + 1; - - private static int dispatchThreadNum; - - private EventQueue queue; - - EventDispatchThread(EventQueue queue) - { - super(); - setName("AWT-EventQueue-" + ++dispatchThreadNum); - this.queue = queue; - - int priority = DEFAULT_PRIORITY; - try - { - String priorityString = - System.getProperty("gnu.awt.dispatchthread.priority"); - if (priorityString != null) - { - priority = Integer.parseInt(priorityString); - } - } - catch (NumberFormatException ex) - { - // Ignore and use default. - } - setPriority(priority); - - // Make sure that an event dispatch thread is never a daemon thread. - setDaemon(false); - } - - public void run() - { - while (true) - { - try - { - AWTEvent evt = queue.getNextEvent(); - - KeyboardFocusManager manager; - manager = KeyboardFocusManager.getCurrentKeyboardFocusManager (); - - // Try to dispatch this event to the current keyboard focus - // manager. It will dispatch all FocusEvents, all - // WindowEvents related to focus, and all KeyEvents, - // returning true. Otherwise, it returns false and we - // dispatch the event normally. - if (!manager.dispatchEvent (evt)) - queue.dispatchEvent(evt); - } - catch (ThreadDeath death) - { - // If someone wants to kill us, let them. - return; - } - catch (InterruptedException ie) - { - // We are interrupted when we should finish executing - return; - } - catch (Throwable x) - { - System.err.println("Exception during event dispatch:"); - x.printStackTrace(System.err); - } - } - } -} Deleted: trunk/core/src/classpath/java/java/awt/EventQueue.java =================================================================== --- trunk/core/src/classpath/java/java/awt/EventQueue.java 2008-03-16 20:23:32 UTC (rev 3855) +++ trunk/core/src/classpath/java/java/awt/EventQueue.java 2008-03-16 20:25:30 UTC (rev 3856) @@ -1,759 +0,0 @@ -/* EventQueue.java -- - Copyright (C) 1999, 2000, 2001, 2002, 2003, 2005 Free Software Foundation - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - - -package java.awt; - -import gnu.java.awt.LowPriorityEvent; -import gnu.java.awt.peer.NativeEventLoopRunningEvent; - -import java.awt.event.*; -import java.awt.peer.ComponentPeer; -import java.awt.peer.LightweightPeer; -import java.lang.reflect.InvocationTargetException; -import java.util.EmptyStackException; - -/* Written using on-line Java 2 Platform Standard Edition v1.3 API - * Specification, as well as "The Java Class Libraries", 2nd edition - * (Addison-Wesley, 1998). - * Status: Believed complete, but untested. - */ - -/** - * This class manages a queue of <code>AWTEvent</code> objects that - * are posted to it. The AWT system uses only one event queue for all - * events. - * - * @author Bryce McKinlay - * @author Aaron M. Renn (ar...@ur...) - */ -public class EventQueue -{ - /** - * Indicates events that are processed with normal priority. This is normally - * all events except PaintEvents. - */ - private static final int NORM_PRIORITY = 0; - - /** - * Indicates events that are processed with lowes priority. This is normally - * all PaintEvents and LowPriorityEvents. - */ - private static final int LOW_PRIORITY = 1; - - /** - * Implements the actual queue. EventQueue has 2 internal queues for - * different priorities: - * 1 PaintEvents are always dispatched with low priority. - * 2. All other events are dispatched with normal priority. - * - * This makes sure that the actual painting (output) is performed _after_ all - * available input has been processed and that the paint regions are - * coalesced as much as possible. - */ - private class Queue - { - /** - * The first item in the queue. This is where events are popped from. - */ - AWTEvent queueHead; - - /** - * The last item. This is where events are posted to. - */ - AWTEvent queueTail; - } - - /** - * The three internal event queues. - * - * @see Queue - */ - private Queue[] queues; - - private EventQueue next; - private EventQueue prev; - private AWTEvent currentEvent; - private long lastWhen = System.currentTimeMillis(); - - private EventDispatchThread dispatchThread = new EventDispatchThread(this); - private boolean nativeLoopRunning = false; - private boolean shutdown = false; - - // @vm-specific allow JNode access from VMAwtAPI - synchronized void setShutdown (boolean b) - //synchronized private void setShutdown (boolean b) - { - shutdown = b; - } - - synchronized boolean isShutdown () - { - if (shutdown) - return true; - - // This is the exact self-shutdown condition specified in J2SE: - // http://java.sun.com/j2se/1.4.2/docs/api/java/awt/doc-files/AWTThreadIssues.html - - if (nativeLoopRunning) - return false; - - if (peekEvent() != null) - return false; - - Frame[] frames = Frame.getFrames(); - for (int i = 0; i < frames.length; ++i) - if (frames[i].isDisplayable()) - return false; - - return true; - } - - /** - * Initializes a new instance of <code>EventQueue</code>. - */ - public EventQueue() - { - queues = new Queue[2]; - queues[NORM_PRIORITY] = new Queue(); - queues[LOW_PRIORITY] = new Queue(); - } - - /** - * Returns the next event in the queue. This method will block until - * an event is available or until the thread is interrupted. - * - * @return The next event in the queue. - * - * @exception InterruptedException If this thread is interrupted while - * waiting for an event to be posted to the queue. - */ - public synchronized AWTEvent getNextEvent() - throws InterruptedException - { - if (next != null) - return next.getNextEvent(); - - AWTEvent res = getNextEventImpl(true); - - while (res == null) - { - if (isShutdown()) - { - // Explicitly set dispathThread to null. If we don't do - // this, there is a race condition where dispatchThread - // can be != null even after the event dispatch thread has - // stopped running. If that happens, then the - // dispatchThread == null check in postEventImpl will - // fail, and a new event dispatch thread will not be - // created, leaving invokeAndWaits waiting indefinitely. - dispatchThread = null; - - // Interrupt the event dispatch thread. - throw new InterruptedException(); - } - - wait(); - res = getNextEventImpl(true); - } - - return res; - } - - /** - * Fetches and possibly removes the next event from the internal queues. - * This method returns immediately. When all queues are empty, this returns - * <code>null</code>: - * - * @param remove <true> when the event should be removed from the queue, - * <code>false</code> otherwise - * - * @return the next event or <code>null</code> when all internal queues - * are empty - */ - private AWTEvent getNextEventImpl(boolean remove) - { - AWTEvent next = null; - for (int i = 0; i < queues.length && next == null; i++) - { - Queue q = queues[i]; - if (q.queueHead != null) - { - // Got an event, remove it. - next = q.queueHead; - if (remove) - { - // Unlink event from the queue. - q.queueHead = next.queueNext; - if (q.queueHead == null) - q.queueTail = null; - next.queueNext = null; - } - } - } - return next; - } - - /** - * Returns the next event in the queue without removing it from the queue. - * This method will block until an event is available or until the thread - * is interrupted. - * - * @return The next event in the queue. - * @specnote Does not block. Returns null if there are no events on the - * queue. - */ - public synchronized AWTEvent peekEvent() - { - if (next != null) - return next.peekEvent(); - - return getNextEventImpl(false); - } - - /** - * Returns the next event in the queue that has the specified id - * without removing it from the queue. - * This method will block until an event is available or until the thread - * is interrupted. - * - * @param id The event id to return. - * - * @return The next event in the queue. - * - * @specnote Does not block. Returns null if there are no matching events - * on the queue. - */ - public synchronized AWTEvent peekEvent(int id) - { - if (next != null) - return next.peekEvent(id); - - AWTEvent evt = null; - for (int i = 0; i < queues.length && evt == null; i++) - { - Queue q = queues[i]; - evt = q.queueHead; - while (evt != null && evt.id != id) - evt = evt.queueNext; - // At this point we either have found an event (evt != null -> exit - // for loop), or we have found no event (evt == null -> search next - // internal queue). - } - return evt; - } - - /** - * Posts a new event to the queue. - * - * @param evt The event to post to the queue. - * - * @exception NullPointerException If event is null. - */ - public void postEvent(AWTEvent evt) - { - postEventImpl(evt); - } - - /** - * Sorts events to their priority and calls - * {@link #postEventImpl(AWTEvent, int)}. - * - * @param evt the event to post - */ - private synchronized final void postEventImpl(AWTEvent evt) - { - int priority = NORM_PRIORITY; - if (evt instanceof PaintEvent || evt instanceof LowPriorityEvent) - priority = LOW_PRIORITY; - // TODO: Maybe let Swing RepaintManager events also be processed with - // low priority. - if (evt instanceof NativeEventLoopRunningEvent) - { - nativeLoopRunning = ((NativeEventLoopRunningEvent) evt).isRunning(); - notify(); - return; - } - postEventImpl(evt, priority); - } - - /** - * Actually performs the event posting. This is needed because the - * RI doesn't use the public postEvent() method when transferring events - * between event queues in push() and pop(). - * - * @param evt the event to post - * @param priority the priority of the event - */ - private final void postEventImpl(AWTEvent evt, int priority) - { - if (evt == null) - throw new NullPointerException(); - - if (next != null) - { - next.postEvent(evt); - return; - } - - Object source = evt.getSource(); - - Queue q = queues[priority]; - if (source instanceof Component) - { - // For PaintEvents, ask the ComponentPeer to coalesce the event - // when the component is heavyweight. - Component comp = (Component) source; - ComponentPeer peer = comp.peer; - if (peer != null && evt instanceof PaintEvent - && ! (peer instanceof LightweightPeer)) - peer.coalescePaintEvent((PaintEvent) evt); - - // Check for any events already on the queue with the same source - // and ID. - AWTEvent previous = null; - for (AWTEvent qevt = q.queueHead; qevt != null; qevt = qevt.queueNext) - { - Object src = qevt.getSource(); - if (qevt.id == evt.id && src == comp) - { - // If there are, call coalesceEvents on the source component - // to see if they can be combined. - Component srccmp = (Component) src; - AWTEvent coalescedEvt = srccmp.coalesceEvents(qevt, evt); - if (coalescedEvt != null) - { - // Yes. Replace the existing event with the combined event. - if (qevt != coalescedEvt) - { - if (previous != null) - { - assert previous.queueNext == qevt; - previous.queueNext = coalescedEvt; - } - else - { - assert q.queueHead == qevt; - q.queueHead = coalescedEvt; - } - coalescedEvt.queueNext = qevt.queueNext; - if (q.queueTail == qevt) - q.queueTail = coalescedEvt; - qevt.queueNext = null; - } - return; - } - } - previous = qevt; - } - } - - if (q.queueHead == null) - { - // We have an empty queue. Set this event both as head and as tail. - q.queueHead = evt; - q.queueTail = evt; - } - else - { - // Note: queueTail should not be null here. - q.queueTail.queueNext = evt; - q.queueTail = evt; - } - - if (dispatchThread == null || !dispatchThread.isAlive()) - { - dispatchThread = new EventDispatchThread(this); - dispatchThread.start(); - } - - notify(); - } - - /** - * Causes runnable to have its run method called in the dispatch thread of the - * EventQueue. This will happen after all pending events are processed. The - * call blocks until this has happened. This method will throw an Error if - * called from the event dispatcher thread. - * - * @exception InterruptedException If another thread has interrupted - * this thread. - * @exception InvocationTargetException If an exception is thrown when running - * runnable. - * - * @since 1.2 - */ - public static void invokeAndWait(Runnable runnable) - throws InterruptedException, InvocationTargetException - { - if (isDispatchThread ()) - throw new Error("Can't call invokeAndWait from event dispatch thread"); - - EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); - Object notifyObject = new Object(); - - InvocationEvent ie = - new InvocationEvent(eq, runnable, notifyObject, true); - - synchronized (notifyObject) - { - eq.postEvent(ie); - notifyObject.wait(); - } - - Exception exception; - - if ((exception = ie.getException()) != null) - throw new InvocationTargetException(exception); - } - - /** - * This arranges for runnable to have its run method called in the - * dispatch thread of the EventQueue. This will happen after all - * pending events are processed. - * - * @since 1.2 - */ - public static void invokeLater(Runnable runnable) - { - EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); - - InvocationEvent ie = - new InvocationEvent(eq, runnable, null, false); - - eq.postEvent(ie); - } - - /** - * Return true if the current thread is the current AWT event dispatch - * thread. - */ - public static boolean isDispatchThread() - { - EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); - - /* Find last EventQueue in chain */ - while (eq.next != null) - eq = eq.next; - - return (Thread.currentThread() == eq.dispatchThread); - } - - /** - * Return the event currently being dispatched by the event - * dispatch thread. If the current thread is not the event - * dispatch thread, this method returns null. - * - * @since 1.4 - */ - public static AWTEvent getCurrentEvent() - { - EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); - Thread ct = Thread.currentThread(); - - /* Find out if this thread is the dispatch thread for any of the - EventQueues in the chain */ - while (ct != eq.dispatchThread) - { - // Try next EventQueue, if any - if (eq.next == null) - return null; // Not an event dispatch thread - eq = eq.next; - } - - return eq.currentEvent; - } - - /** - * Allows a custom EventQueue implementation to replace this one. - * All pending events are transferred to the new queue. Calls to postEvent, - * getNextEvent, and peekEvent and others are forwarded to the pushed queue - * until it is removed with a pop(). - * - * @exception NullPointerException if newEventQueue is null. - */ - public synchronized void push(EventQueue newEventQueue) - { - if (newEventQueue == null) - throw new NullPointerException (); - - /* Make sure we are at the top of the stack because callers can - only get a reference to the one at the bottom using - Toolkit.getDefaultToolkit().getSystemEventQueue() */ - if (next != null) - { - next.push (newEventQueue); - return; - } - - /* Make sure we have a live dispatch thread to drive the queue */ - if (dispatchThread == null) - dispatchThread = new EventDispatchThread(this); - - synchronized (newEventQueue) - { - // The RI transfers the events without calling the new eventqueue's - // push(), but using getNextEvent(). - while (peekEvent() != null) - { - try - { - newEventQueue.postEventImpl(getNextEvent()); - } - catch (InterruptedException ex) - { - // What should we do with this? - ex.printStackTrace(); - } - } - newEventQueue.prev = this; - } - - next = newEventQueue; - } - - /** Transfer any pending events from this queue back to the parent queue that - * was previously push()ed. Event dispatch from this queue is suspended. - * - * @exception EmptyStackException If no previous push was made on this - * EventQueue. - */ - protected void pop() throws EmptyStackException - { - /* The order is important here, we must get the prev lock first, - or deadlock could occur as callers usually get here following - prev's next pointer, and thus obtain prev's lock before trying - to get this lock. */ - EventQueue previous = prev; - if (previous == null) - throw new EmptyStackException(); - synchronized (previous) - { - synchronized (this) - { - EventQueue nextQueue = next; - if (nextQueue != null) - { - nextQueue.pop(); - } - else - { - previous.next = null; - - // The RI transfers the events without calling the new eventqueue's - // push(), so this should be OK and most effective. - while (peekEvent() != null) - { - try - { - previous.postEventImpl(getNextEvent()); - } - catch (InterruptedException ex) - { - // What should we do with this? - ex.printStackTrace(); - } - } - - prev = null; - setShutdown(true); - dispatchThread = null; - this.notifyAll(); - } - } - } - } - - /** - * Dispatches an event. The manner in which the event is dispatched depends - * upon the type of the event and the type of the event's source object. - * - * @exception NullPointerException If event is null. - */ - protected void dispatchEvent(AWTEvent evt) - { - currentEvent = evt; - - if (evt instanceof InputEvent) - lastWhen = ((InputEvent) evt).getWhen(); - else if (evt instanceof ActionEvent) - lastWhen = ((ActionEvent) evt).getWhen(); - else if (evt instanceof InvocationEvent) - lastWhen = ((InvocationEvent) evt).getWhen(); - - if (evt instanceof ActiveEvent) - { - ActiveEvent active_evt = (ActiveEvent) evt; - active_evt.dispatch(); - } - else - { - Object source = evt.getSource(); - - if (source instanceof Component) - { - Component srccmp = (Component) source; - srccmp.dispatchEvent(evt); - } - else if (source instanceof MenuComponent) - { - MenuComponent srccmp = (MenuComponent) source; - srccmp.dispatchEvent(evt); - } - } - } - - /** - * Returns the timestamp of the most recent event that had a timestamp, or - * the initialization time of the event queue if no events have been fired. - * At present, only <code>InputEvent</code>s, <code>ActionEvent</code>s, - * <code>InputMethodEvent</code>s, and <code>InvocationEvent</code>s have - * timestamps, but this may be added to other events in future versions. - * If this is called by the event dispatching thread, it can be any - * (sequential) value, but to other threads, the safest bet is to return - * System.currentTimeMillis(). - * - * @return the most recent timestamp - * @see InputEvent#getWhen() - * @see ActionEvent#getWhen() - * @see InvocationEvent#getWhen() - * @see InputMethodEvent#getWhen() - * @since 1.4 - */ - public static long getMostRecentEventTime() - { - EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue(); - if (Thread.currentThread() != eq.dispatchThread) - return System.currentTimeMillis(); - return eq.lastWhen; - } - - //jnode openjdk - static void setCurrentEventAndMostRecentTime(AWTEvent e) { - Toolkit.getEventQueue().setCurrentEventAndMostRecentTimeImpl(e); - } - private synchronized void setCurrentEventAndMostRecentTimeImpl(AWTEvent e) - { - if (Thread.currentThread() != dispatchThread) { - return; - } - - currentEvent = e; - - // This series of 'instanceof' checks should be replaced with a - // polymorphic type (for example, an interface which declares a - // getWhen() method). However, this would require us to make such - // a type public, or to place it in sun.awt. Both of these approaches - // have been frowned upon. So for now, we hack. - // - // In tiger, we will probably give timestamps to all events, so this - // will no longer be an issue. - long mostRecentEventTime2 = Long.MIN_VALUE; - if (e instanceof InputEvent) { - InputEvent ie = (InputEvent)e; - mostRecentEventTime2 = ie.getWhen(); - } else if (e instanceof InputMethodEvent) { - InputMethodEvent ime = (InputMethodEvent)e; - mostRecentEventTime2 = ime.getWhen(); - } else if (e instanceof ActionEvent) { - ActionEvent ae = (ActionEvent)e; - mostRecentEventTime2 = ae.getWhen(); - } else if (e instanceof InvocationEvent) { - InvocationEvent ie = (InvocationEvent)e; - mostRecentEventTime2 = ie.getWhen(); - } - mostRecentEventTime = Math.max(mostRecentEventTime, mostRecentEventTime2); - } - /* - * The time stamp of the last dispatched InputEvent or ActionEvent. - */ - private long mostRecentEventTime = System.currentTimeMillis(); - -/* - * Removes any pending events for the specified source object. - * If removeAllEvents parameter is <code>true</code> then all - * events for the specified source object are removed, if it - * is <code>false</code> then <code>SequencedEvent</code>, <code>SentEvent</code>, - * <code>FocusEvent</code>, <code>WindowEvent</code>, <code>KeyEvent</code>, - * and <code>InputMethodEvent</code> are kept in the queue, but all other - * events are removed. - * - * This method is normally called by the source's - * <code>removeNotify</code> method. - */ -final void removeSourceEvents(Object source, boolean removeAllEvents) { - /* - SunToolkit.flushPendingEvents(); - synchronized (this) { - for (int i = 0; i < NUM_PRIORITIES; i++) { - EventQueueItem entry = queues[i].head; - EventQueueItem prev = null; - while (entry != null) { - if ((entry.event.getSource() == source) - && (removeAllEvents - || ! (entry.event instanceof SequencedEvent - || entry.event instanceof SentEvent - || entry.event instanceof FocusEvent - || entry.event instanceof WindowEvent - || entry.event instanceof KeyEvent - || entry.event instanceof InputMethodEvent))) - { - if (entry.event instanceof SequencedEvent) { - ((SequencedEvent)entry.event).dispose(); - } - if (entry.event instanceof SentEvent) { - ((SentEvent)entry.event).dispose(); - } - if (prev == null) { - queues[i].head = entry.next; - } else { - prev.next = entry.next; - } - uncacheEQItem(entry); - } else { - prev = entry; - } - entry = entry.next; - } - queues[i].tail = prev; - } - } - */ -} - - -} Deleted: trunk/core/src/classpath/java/java/awt/KeyboardFocusManager.java =================================================================== --- trunk/core/src/classpath/java/java/awt/KeyboardFocusManager.java 2008-03-16 20:23:32 UTC (rev 3855) +++ trunk/core/src/classpath/java/java/awt/KeyboardFocusManager.java 2008-03-16 20:25:30 UTC (rev 3856) @@ -1,1489 +0,0 @@ -/* KeyboardFocusManager.java -- manage component focusing via the keyboard - Copyright (C) 2002, 2004 Free Software Foundation - -This file is part of GNU Classpath. - -GNU Classpath is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU Classpath is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Classpath; see the file COPYING. If not, write to the -Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -02110-1301 USA. - -Linking this library statically or dynamically with other modules is -making a combined work based on this library. Thus, the terms and -conditions of the GNU General Public License cover the whole -combination. - -As a special exception, the copyright holders of this library give you -permission to link this library with independent modules to produce an -executable, regardless of the license terms of these independent -modules, and to copy and distribute the resulting executable under -terms of your choice, provided that you also meet, for each linked -independent module, the terms and conditions of the license of that -module. An independent module is a module which is not derived from -or based on this library. If you modify this library, you may extend -this exception to your version of the library, but you are not -obligated to do so. If you do not wish to do so, delete this -exception statement from your version. */ - - -package java.awt; - -import java.applet.Applet; -import java.awt.FocusTraversalPolicy; -import java.awt.event.FocusEvent; -import java.awt.event.KeyEvent; -import java.awt.event.WindowEvent; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.beans.PropertyVetoException; -import java.beans.VetoableChangeListener; -import java.beans.VetoableChangeSupport; -import java.util.*; -import java.util.List; - -/** - * The <code>KeyboardFocusManager</code> handles the focusing of - * windows for receiving keyboard events. The manager handles - * the dispatch of all <code>FocusEvent</code>s and - * <code>KeyEvent</code>s, along with <code>WindowEvent</code>s - * relating to the focused window. Users can use the manager - * to ascertain the current focus owner and fire events. - * <br /> - * <br /> - * The focus owner is the <code>Component</code> that receives - * key events. The focus owner is either the currently focused - * window or a component within this window. - * <br /> - * <br /> - * The underlying native windowing system may denote the active - * window or its children with special decorations (e.g. a highlighted - * title bar). The active window is always either a <code>Frame</code> - * or <code>Dialog</code>, and is either the currently focused - * window or its owner. - * <br /> - * <br /> - * Applets may be partitioned into different applet contexts, according - * to their code base. In this case, each context has its own - * <code>KeyboardFocusManager</code>, as opposed to the global - * manager maintained by applets which share the same context. - * Each context is insulated from the others, and they don't interact. - * The resulting behaviour, as with context division, depends on the browser - * supporting the applets. Regardless, there can only ever be - * one focused window, one active window and one focus owner - * per <code>ClassLoader</code>. - * <br /> - * <br /> - * To support this separation of focus managers, the manager instances - * and the internal state information is grouped by the - * <code>ThreadGroup</code> to which it pertains. With respect to - * applets, each code base has its own <code>ThreadGroup</code>, so the - * isolation of each context is enforced within the manager. - * <br /> - * <br /> - * By default, the manager defines TAB and Ctrl+TAB as the - * forward focus traversal keys and Shift+TAB and Ctrl+Shift+TAB - * as the backward focus traversal keys. No up or down cycle - * traversal keys are defined by default. Traversal takes effect - * on the firing of a relevant <code>KEY_PRESSED</code> event. - * However, all other key events related to the use of the - * defined focus traversal key sequence are consumed and not - * dispatched. - * <br /> - * <br /> - * These default traversal keys come into effect on all windows - * for which no alternative set of keys is defined. This also - * applies recursively to any child components of such a window, - * which define no traversal keys of their own. - * - * @author Eric Blake (eb...@em...) - * @author Thomas Fitzsimmons (fi...@re...) - * @author Andrew John Hughes (gnu...@me...) - * @since 1.4 - */ -public abstract class KeyboardFocusManager - implements KeyEventDispatcher, KeyEventPostProcessor -{ - /** Identifies {@link AWTKeyStroke}s that move the focus forward in - the focus cycle. */ - public static final int FORWARD_TRAVERSAL_KEYS = 0; - - /** Identifies {@link AWTKeyStroke}s that move the focus backward in - the focus cycle. */ - public static final int BACKWARD_TRAVERSAL_KEYS = 1; - - /** Identifies {@link AWTKeyStroke}s that move the focus up to the - parent focus cycle root. */ - public static final int UP_CYCLE_TRAVERSAL_KEYS = 2; - - /** Identifies {@link AWTKeyStroke}s that move the focus down to the - child focus cycle root. */ - public static final int DOWN_CYCLE_TRAVERSAL_KEYS = 3; - - /** The set of {@link AWTKeyStroke}s that cause focus to be moved to - the next focusable Component in the focus cycle. */ - private static final Set DEFAULT_FORWARD_KEYS; - - /** The set of {@link AWTKeyStroke}s that cause focus to be moved to - the previous focusable Component in the focus cycle. */ - private static final Set DEFAULT_BACKWARD_KEYS; - - /** Populate the DEFAULT_FORWARD_KEYS and DEFAULT_BACKWARD_KEYS - {@link java.util.Set}s. */ - static - { - Set s = new HashSet(); - s.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_TAB, 0)); - s.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_TAB, - KeyEvent.CTRL_DOWN_MASK)); - DEFAULT_FORWARD_KEYS = Collections.unmodifiableSet(s); - s = new HashSet(); - s.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_TAB, - KeyEvent.SHIFT_DOWN_MASK)); - s.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_TAB, - KeyEvent.SHIFT_DOWN_MASK - | KeyEvent.CTRL_DOWN_MASK)); - DEFAULT_BACKWARD_KEYS = Collections.unmodifiableSet(s); - } - - /** The global object {@link java.util.Map}s. */ - - /** For security reasons, {@link java.applet.Applet}s in different - codebases must be insulated from one another. Since {@link - KeyboardFocusManager}s have the ability to return {@link - Component}s from a given {@link java.applet.Applet}, each - codebase must have an independent {@link KeyboardFocusManager}. - Since each codebase has its own {@link ThreadGroup} in which its - {@link Applet}s run, it makes sense to partition {@link - KeyboardFocusManager}s according to {@link - java.lang.ThreadGroup}. Thus, currentKeyboardFocusManagers is a - {@link java.util.Map} keyed on {@link java.lang.ThreadGroup}. */ - private static Map currentKeyboardFocusManagers = new HashMap (); - - /** {@link java.applet.Applet}s in one codebase must not be allowed - to access {@link Component}s in {@link java.applet.Applet}s in - other codebases. To enforce this restriction, we key the - following {@link java.util.Map}s on {@link java.lang.ThreadGroup}s (which - are per-codebase). For example, if {@link - java.lang.ThreadGroup} A calls {@link #setGlobalFocusOwner}, - passing {@link Component} C, currentFocusOwners[A] is assigned - C, and all other currentFocusOwners values are nullified. Then - if {@link java.lang.ThreadGroup} A subsequently calls {@link - #getGlobalFocusOwner}, it will return currentFocusOwners[A], - that is, {@link Component} C. If another {@link - java.lang.ThreadGroup} K calls {@link #getGlobalFocusOwner}, it - will return currentFocusOwners[K], that is, null. - - Since this is a static field, we ensure that there is only one - focused {@link Component} per class loader. */ - private static Map currentFocusOwners = new HashMap (); - - /** A {@link java.util.Map} keyed on {@link java.lang.ThreadGroup}s - that stores the {@link Component} that owns the permanent - keyboard focus. @see currentFocusOwners */ - private static Map currentPermanentFocusOwners = new HashMap (); - - /** A {@link java.util.Map} keyed on {@link java.lang.ThreadGroup}s - that stores the focused {@link Window}. @see - currentFocusOwners */ - private static Map currentFocusedWindows = new HashMap (); - - /** A {@link java.util.Map} keyed on {@link java.lang.ThreadGroup}s - that stores the active {@link Window}. @see - currentFocusOwners */ - private static Map currentActiveWindows = new HashMap (); - - /** A {@link java.util.Map} keyed on {@link java.lang.ThreadGroup}s - that stores the focus cycle root {@link Container}. @see - currentFocusOwners */ - private static Map currentFocusCycleRoots = new HashMap (); - - /** The default {@link FocusTraversalPolicy} that focus-managing - {@link Container}s will use to define their initial focus - traversal policy. */ - private FocusTraversalPolicy defaultPolicy; - - /** An array that stores the {@link #FORWARD_TRAVERSAL_KEYS}, {@link - #BACKWARD_TRAVERSAL_KEYS}, {@link #UP_CYCLE_TRAVERSAL_KEYS} and - {@link #DOWN_CYCLE_TRAVERSAL_KEYS} {@link AWTKeyStroke}s {@link - java.util.Set}s. */ - private Set[] defaultFocusKeys = new Set[] - { - DEFAULT_FORWARD_KEYS, DEFAULT_BACKWARD_KEYS, - Collections.EMPTY_SET, Collections.EMPTY_SET - }; - - /** - * A utility class to support the handling of events relating to property changes. - */ - private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport (this); - - /** - * A utility class to support the handling of events relating to vetoable changes. - */ - private final VetoableChangeSupport vetoableChangeSupport = new VetoableChangeSupport (this); - - /** A list of {@link KeyEventDispatcher}s that process {@link - KeyEvent}s before they are processed the default keyboard focus - manager. */ - private final ArrayList keyEventDispatchers = new ArrayList(); - - /** A list of {@link KeyEventPostProcessor}s that process unconsumed - {@link KeyEvent}s. */ - private final ArrayList keyEventPostProcessors = new ArrayList(); - - /** - * Construct a KeyboardFocusManager. - */ - public KeyboardFocusManager () - { - } - - /** - * Retrieve the keyboard focus manager associated with the {@link - * java.lang.ThreadGroup} to which the calling thread belongs. - * - * @return the keyboard focus manager associated with the current - * thread group - */ - public static KeyboardFocusManager getCurrentKeyboardFocusManager () - { - ThreadGroup currentGroup = Thread.currentThread ().getThreadGroup (); - - if (currentKeyboardFocusManagers.get (currentGroup) == null) - setCurrentKeyboardFocusManager (null); - - return (KeyboardFocusManager) currentKeyboardFocusManagers.get (currentGroup); - } - - /** - * Set the keyboard focus manager associated with the {@link - * java.lang.ThreadGroup} to which the calling thread belongs. - * - * @param m the keyboard focus manager for the current thread group - */ - public static void setCurrentKeyboardFocusManager (KeyboardFocusManager m) - { - SecurityManager sm = System.getSecurityManager (); - if (sm != null) - sm.checkPermission (new AWTPermission ("replaceKeyboardFocusManager")); - - ThreadGroup currentGroup = Thread.currentThread ().getThreadGroup (); - KeyboardFocusManager manager; - - if (m == null) - manager = new DefaultKeyboardFocusManager(); - else - manager = m; - - currentKeyboardFocusManagers.put (currentGroup, manager); - } - - /** - * Retrieve the {@link Component} that has the keyboard focus, or - * null if the focus owner was not set by a thread in the current - * {@link java.lang.ThreadGroup}. - * - * @return the keyboard focus owner or null - */ - public Component getFocusOwner () - { - Component owner = (Component) getObject (currentFocusOwners); - if (owner == null) - owner = (Component) getObject (currentPermanentFocusOwners); - return owner; - } - - /** - * Retrieve the {@link Component} that has the keyboard focus, - * regardless of whether or not it was set by a thread in the - * current {@link java.lang.ThreadGroup}. If there is no temporary - * focus owner in effect then this method will return the same value - * as {@link #getGlobalPermanentFocusOwner}. - * - * @return the keyboard focus owner - * @throws SecurityException if this is not the keyboard focus - * manager associated with the current {@link java.lang.ThreadGroup} - */ - protected Component getGlobalFocusOwner () - { - // Check if there is a temporary focus owner. - Component focusOwner = (Component) getGlobalObject (currentFocusOwners); - - return (focusOwner == null) ? getGlobalPermanentFocusOwner () : focusOwner; - } - - /** - * Set the {@link Component} that will be returned by {@link - * #getFocusOwner} (when it is called from the current {@link - * java.lang.ThreadGroup}) and {@link #getGlobalFocusOwner}. This - * method does not actually transfer the keyboard focus. - * - * @param owner the Component to return from getFocusOwner and - * getGlobalFocusOwner - * - * @see Component#requestFocus() - * @see Component#requestFocusInWindow() - */ - protected void setGlobalFocusOwner (Component owner) - { - if (owner == null || owner.focusable) - setGlobalObject (currentFocusOwners, owner, "focusOwner"); - } - - /** - * Clear the global focus owner and deliver a FOCUS_LOST event to - * the previously-focused {@link Component}. Until another {@link - * Component} becomes the keyboard focus owner, key events will be - * discarded by top-level windows. - */ - public void clearGlobalFocusOwner () - { - synchronized (currentFocusOwners) - { - Component focusOwner = getGlobalFocusOwner (); - Component permanentFocusOwner = getGlobalPermanentFocusOwner (); - - setGlobalFocusOwner (null); - setGlobalPermanentFocusOwner (null); - - // Inform the old focus owner that it has lost permanent - // focus. - if (focusOwner != null) - { - // We can't cache the event queue, because of - // bootstrapping issues. We need to set the default - // KeyboardFocusManager in EventQueue before the event - // queue is started. - EventQueue q = Toolkit.getDefaultToolkit ().getSystemEventQueue (); - if (focusOwner != permanentFocusOwner) - q.postEvent (new FocusEvent (focusOwner, FocusEvent.FOCUS_LOST, true)); - else - q.postEvent (new FocusEvent (focusOwner, FocusEvent.FOCUS_LOST, false)); - } - - if (focusOwner != permanentFocusOwner) - { - EventQueue q = Toolkit.getDefaultToolkit ().getSystemEventQueue (); - q.postEvent (new FocusEvent (permanentFocusOwner, FocusEvent.FOCUS_LOST, false)); - } - } - } - - /** - * Retrieve the {@link Component} that has the permanent keyboard - * focus, or null if the focus owner was not set by a thread in the - * current {@link java.lang.ThreadGroup}. - * - * @return the keyboard focus owner or null - */ - public Component getPermanentFocusOwner () - { - return (Component) getObject (currentPermanentFocusOwners); - } - - /** - * Retrieve the {@link Component} that has the permanent keyboard - * focus, regardless of whether or not it was set by a thread in the - * current {@link java.lang.ThreadGroup}. - * - * @return the keyboard focus owner - * @throws SecurityException if this is not the keyboard focus - * manager associated with the current {@link java.lang.ThreadGroup} - */ - protected Component getGlobalPermanentFocusOwner () - { - return (Component) getGlobalObject (currentPermanentFocusOwners); - } - - /** - * Set the {@link Component} that will be returned by {@link - * #getPermanentFocusOwner} (when it is called from the current - * {@link java.lang.ThreadGroup}) and {@link - * #getGlobalPermanentFocusOwner}. This method does not actually - * transfer the keyboard focus. - * - * @param focusOwner the Component to return from - * getPermanentFocusOwner and getGlobalPermanentFocusOwner - * - * @see Component#requestFocus() - * @see Component#requestFocusInWindow() - */ - protected void setGlobalPermanentFocusOwner (Component focusOwner) - { - if (focusOwner == null || focusOwner.focusable) - setGlobalObject (currentPermanentFocusOwners, focusOwner, - "permanentFocusOwner"); - } - - /** - * Retrieve the {@link Window} that is or contains the keyboard - * focus owner, or null if the focused window was not set by a - * thread in the current {@link java.lang.ThreadGroup}. - * - * @return the focused window or null - */ - public Window getFocusedWindow () - { - return (Window) getObject (currentFocusedWindows); - } - - /** - * Retrieve the {@link Window} that is or contains the focus owner, - * regardless of whether or not the {@link Window} was set focused - * by a thread in the current {@link java.lang.ThreadGroup}. - * - * @return the focused window - * @throws SecurityException if this is not the keyboard focus - * manager associated with the current {@link java.lang.ThreadGroup} - */ - protected Window getGlobalFocusedWindow () - { - return (Window) getGlobalObject (currentFocusedWindows); - } - - /** - * Set the {@link Window} that will be returned by {@link - * #getFocusedWindow} (when it is called from the current {@link - * java.lang.ThreadGroup}) and {@link #getGlobalFocusedWindow}. - * This method does not actually cause <code>window</code> to become - * the focused {@link Window}. - * - * @param window the Window to return from getFocusedWindow and - * getGlobalFocusedWindow - */ - protected void setGlobalFocusedWindow (Window window) - { - if (window == null || window.focusable) - setGlobalObject (currentFocusedWindows, window, "focusedWindow"); - } - - /** - * Retrieve the active {@link Window}, or null if the active window - * was not set by a thread in the current {@link - * java.lang.ThreadGroup}. - * - * @return the active window or null - */ - public Window getActiveWindow() - { - return (Window) getObject (currentActiveWindows); - } - - /** - * Retrieve the active {@link Window}, regardless of whether or not - * the {@link Window} was made active by a thread in the current - * {@link java.lang.ThreadGroup}. - * - * @return the active window - * @throws SecurityException if this is not the keyboard focus - * manager associated with the current {@link java.lang.ThreadGroup} - */ - protected Window getGlobalActiveWindow() - { - return (Window) getGlobalObject (currentActiveWindows); - } - - /** - * Set the {@link Window} that will be returned by {@link - * #getActiveWindow} (when it is called from the current {@link - * java.lang.ThreadGroup}) and {@link #getGlobalActiveWindow}. This - * method does not actually cause <code>window</code> to be made - * active. - * - * @param window the Window to return from ge... [truncated message content] |