001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: /**
018: * @author Mikhail Danilov
019: * @version $Revision$
020: */package org.apache.harmony.awt.wtk;
021:
022: import java.util.LinkedList;
023:
024: /**
025: * Describes the cross-platform native event queue interface
026: *
027: * <p/> The implementation constructor should remember thread it was
028: * created. All other methods would be called obly from this thread,
029: * except awake().
030: */
031: public abstract class NativeEventQueue {
032:
033: private ShutdownWatchdog shutdownWatchdog;
034:
035: private class EventMonitor {
036: }
037:
038: private final Object eventMonitor = new EventMonitor();
039: private final LinkedList<NativeEvent> eventQueue = new LinkedList<NativeEvent>();
040:
041: public static abstract class Task {
042: public volatile Object returnValue;
043:
044: public abstract void perform();
045: }
046:
047: /**
048: * Blocks current thread until native event queue is not empty
049: * or awaken from other thread by awake().
050: *
051: * <p/>Should be called only on tread which
052: * will process native events.
053: *
054: * @return if event loop should be stopped
055: */
056: public abstract boolean waitEvent();
057:
058: /**
059: * Determines whether or not the native event queue is empty.
060: * An queue is empty if it contains no messages waiting.
061: *
062: * @return true if the queue is empty; false otherwise
063: */
064: public boolean isEmpty() {
065: synchronized (eventQueue) {
066: return eventQueue.isEmpty();
067: }
068: }
069:
070: public NativeEvent getNextEvent() {
071: synchronized (eventQueue) {
072: if (eventQueue.isEmpty()) {
073: shutdownWatchdog.setNativeQueueEmpty(true);
074: return null;
075: }
076: return eventQueue.remove(0);
077: }
078: }
079:
080: protected void addEvent(NativeEvent event) {
081: synchronized (eventQueue) {
082: eventQueue.add(event);
083: shutdownWatchdog.setNativeQueueEmpty(false);
084: }
085: synchronized (eventMonitor) {
086: eventMonitor.notify();
087: }
088: }
089:
090: public final Object getEventMonitor() {
091: return eventMonitor;
092: }
093:
094: public abstract void awake();
095:
096: /**
097: * Gets AWT system window ID.
098: *
099: * @return AWT system window ID
100: */
101: public abstract long getJavaWindow();
102:
103: /**
104: * Add NativeEvent to the queue
105: */
106: public abstract void dispatchEvent();
107:
108: public abstract void performTask(Task task);
109:
110: public abstract void performLater(Task task);
111:
112: public final void setShutdownWatchdog(ShutdownWatchdog watchdog) {
113: synchronized (eventQueue) {
114: shutdownWatchdog = watchdog;
115: }
116: }
117:
118: }
|