auto import from //depot/cupcake/@135843
This commit is contained in:
253
awt/java/awt/EventQueueCore.java
Normal file
253
awt/java/awt/EventQueueCore.java
Normal file
@@ -0,0 +1,253 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
/**
|
||||
* @author Pavel Dolgov
|
||||
* @version $Revision$
|
||||
*/
|
||||
package java.awt;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.InputMethodEvent;
|
||||
import java.awt.event.InvocationEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.util.LinkedList;
|
||||
|
||||
import org.apache.harmony.awt.internal.nls.Messages;
|
||||
|
||||
/**
|
||||
* The events storage for EventQueue
|
||||
*/
|
||||
final class EventQueueCore {
|
||||
|
||||
private final LinkedList<EventQueue> queueStack = new LinkedList<EventQueue>();
|
||||
private final LinkedList<AWTEvent> events = new LinkedList<AWTEvent>();
|
||||
|
||||
private Toolkit toolkit;
|
||||
private EventQueue activeQueue;
|
||||
private Thread dispatchThread;
|
||||
|
||||
AWTEvent currentEvent;
|
||||
long mostRecentEventTime = System.currentTimeMillis();
|
||||
|
||||
EventQueueCore(EventQueue eq) {
|
||||
synchronized (this) {
|
||||
queueStack.addLast(eq);
|
||||
activeQueue = eq;
|
||||
}
|
||||
}
|
||||
|
||||
EventQueueCore(EventQueue eq, Toolkit t) {
|
||||
synchronized (this) {
|
||||
queueStack.addLast(eq);
|
||||
activeQueue = eq;
|
||||
setToolkit(t);
|
||||
}
|
||||
}
|
||||
|
||||
synchronized long getMostRecentEventTime() {
|
||||
return mostRecentEventTime;
|
||||
}
|
||||
|
||||
synchronized AWTEvent getCurrentEvent() {
|
||||
return currentEvent;
|
||||
}
|
||||
|
||||
synchronized boolean isSystemEventQueue() {
|
||||
return toolkit != null;
|
||||
}
|
||||
|
||||
private void setToolkit(Toolkit t) {
|
||||
toolkit = t;
|
||||
if (toolkit != null) {
|
||||
toolkit.setSystemEventQueueCore(this);
|
||||
dispatchThread = toolkit.dispatchThread;
|
||||
}
|
||||
}
|
||||
|
||||
synchronized void postEvent(AWTEvent event) {
|
||||
//???AWT
|
||||
/*
|
||||
events.addLast(event);
|
||||
if ((toolkit == null) && (dispatchThread == null)) {
|
||||
dispatchThread = new EventQueueThread(this);
|
||||
dispatchThread.start();
|
||||
}
|
||||
// TODO: add event coalescing
|
||||
if (toolkit != null) {
|
||||
toolkit.shutdownWatchdog.setAwtQueueEmpty(false);
|
||||
if (!GraphicsEnvironment.getLocalGraphicsEnvironment().isHeadlessInstance()) {
|
||||
notifyEventMonitor(toolkit);
|
||||
}
|
||||
}
|
||||
notifyAll();
|
||||
*/
|
||||
}
|
||||
|
||||
void notifyEventMonitor(Toolkit t) {
|
||||
Object em = t.getNativeEventQueue().getEventMonitor();
|
||||
synchronized (em) {
|
||||
em.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
synchronized AWTEvent getNextEvent() throws InterruptedException {
|
||||
while (events.isEmpty()) {
|
||||
wait();
|
||||
}
|
||||
AWTEvent event = events.removeFirst();
|
||||
// TODO: add event coalescing
|
||||
return event;
|
||||
}
|
||||
|
||||
synchronized AWTEvent peekEvent() {
|
||||
return events.isEmpty() ? null : events.getFirst();
|
||||
}
|
||||
|
||||
synchronized AWTEvent peekEvent(int id) {
|
||||
for (AWTEvent event : events) {
|
||||
if (event.getID() == id) {
|
||||
return event;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
synchronized void dispatchEvent(AWTEvent event) {
|
||||
updateCurrentEventAndTime(event);
|
||||
try {
|
||||
activeQueue.dispatchEvent(event);
|
||||
} finally {
|
||||
currentEvent = null;
|
||||
}
|
||||
}
|
||||
|
||||
void dispatchEventImpl(AWTEvent event) {
|
||||
if (event instanceof ActiveEvent) {
|
||||
updateCurrentEventAndTime(event);
|
||||
try {
|
||||
((ActiveEvent) event).dispatch();
|
||||
} finally {
|
||||
currentEvent = null;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Object src = event.getSource();
|
||||
|
||||
if (src instanceof Component) {
|
||||
if (preprocessComponentEvent(event)) {
|
||||
((Component) src).dispatchEvent(event);
|
||||
}
|
||||
} else {
|
||||
if (toolkit != null) {
|
||||
toolkit.dispatchAWTEvent(event);
|
||||
}
|
||||
if (src instanceof MenuComponent) {
|
||||
((MenuComponent) src).dispatchEvent(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private final boolean preprocessComponentEvent(AWTEvent event) {
|
||||
if (event instanceof MouseEvent) {
|
||||
return preprocessMouseEvent((MouseEvent)event);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private final boolean preprocessMouseEvent(MouseEvent event) {
|
||||
//???AWT
|
||||
/*
|
||||
if (toolkit != null && toolkit.mouseEventPreprocessor != null) {
|
||||
toolkit.lockAWT();
|
||||
try {
|
||||
return toolkit.mouseEventPreprocessor.preprocess(event);
|
||||
} finally {
|
||||
toolkit.unlockAWT();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
*/
|
||||
return true;
|
||||
}
|
||||
|
||||
private void updateCurrentEventAndTime(AWTEvent event) {
|
||||
currentEvent = event;
|
||||
long when = 0;
|
||||
if (event instanceof ActionEvent) {
|
||||
when = ((ActionEvent) event).getWhen();
|
||||
} else if (event instanceof InputEvent) {
|
||||
when = ((InputEvent) event).getWhen();
|
||||
} else if (event instanceof InputMethodEvent) {
|
||||
when = ((InputMethodEvent) event).getWhen();
|
||||
} else if (event instanceof InvocationEvent) {
|
||||
when = ((InvocationEvent) event).getWhen();
|
||||
}
|
||||
if (when != 0) {
|
||||
mostRecentEventTime = when;
|
||||
}
|
||||
}
|
||||
|
||||
synchronized void push(EventQueue newEventQueue) {
|
||||
// TODO: handle incorrect situations
|
||||
if (queueStack.isEmpty()) {
|
||||
// awt.6B=Queue stack is empty
|
||||
throw new IllegalStateException(Messages.getString("awt.6B")); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
queueStack.addLast(newEventQueue);
|
||||
activeQueue = newEventQueue;
|
||||
activeQueue.setCore(this);
|
||||
}
|
||||
|
||||
synchronized void pop() {
|
||||
EventQueue removed = queueStack.removeLast();
|
||||
if (removed != activeQueue) {
|
||||
// awt.6C=Event queue stack is broken
|
||||
throw new IllegalStateException(Messages.getString("awt.6C")); //$NON-NLS-1$
|
||||
}
|
||||
activeQueue = queueStack.getLast();
|
||||
removed.setCore(null);
|
||||
}
|
||||
|
||||
synchronized AWTEvent getNextEventNoWait() {
|
||||
try {
|
||||
return events.isEmpty() ? null : activeQueue.getNextEvent();
|
||||
} catch (InterruptedException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
synchronized boolean isEmpty() {
|
||||
return (currentEvent == null) && events.isEmpty();
|
||||
}
|
||||
|
||||
synchronized boolean isEmpty(long timeout) {
|
||||
if (!isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
wait(timeout);
|
||||
} catch (InterruptedException e) {}
|
||||
return isEmpty();
|
||||
}
|
||||
|
||||
synchronized EventQueue getActiveEventQueue() {
|
||||
return activeQueue;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user