/* * 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; } }