/*
* 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 Mikhail Danilov
* @version $Revision$
*/
package org.apache.harmony.awt.wtk;
import java.util.LinkedList;
/**
* Describes the cross-platform native event queue interface
*
* <p/> The implementation constructor should remember thread it was
* created. All other methods would be called obly from this thread,
* except awake().
*/
public abstract class NativeEventQueue {
private ShutdownWatchdog shutdownWatchdog;
private class EventMonitor {}
private final Object eventMonitor = new EventMonitor();
private final LinkedList<NativeEvent> eventQueue = new LinkedList<NativeEvent>();
public static abstract class Task {
public volatile Object returnValue;
public abstract void perform();
}
/**
* Blocks current thread until native event queue is not empty
* or awaken from other thread by awake().
*
* <p/>Should be called only on tread which
* will process native events.
*
* @return if event loop should be stopped
*/
public abstract boolean waitEvent();
/**
* Determines whether or not the native event queue is empty.
* An queue is empty if it contains no messages waiting.
*
* @return true if the queue is empty; false otherwise
*/
public boolean isEmpty() {
synchronized(eventQueue) {
return eventQueue.isEmpty();
}
}
public NativeEvent getNextEvent() {
synchronized (eventQueue) {
if (eventQueue.isEmpty()) {
shutdownWatchdog.setNativeQueueEmpty(true);
return null;
}
return eventQueue.remove(0);
}
}
protected void addEvent(NativeEvent event) {
synchronized (eventQueue) {
eventQueue.add(event);
shutdownWatchdog.setNativeQueueEmpty(false);
}
synchronized (eventMonitor) {
eventMonitor.notify();
}
}
public final Object getEventMonitor() {
return eventMonitor;
}
public abstract void awake();
/**
* Gets AWT system window ID.
*
* @return AWT system window ID
*/
public abstract long getJavaWindow();
/**
* Add NativeEvent to the queue
*/
public abstract void dispatchEvent();
public abstract void performTask(Task task);
public abstract void performLater(Task task);
public final void setShutdownWatchdog(ShutdownWatchdog watchdog) {
synchronized (eventQueue) {
shutdownWatchdog = watchdog;
}
}
}
|