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