blob: e38d5240208ecbf27ba521009b290df80f15ee76 [file] [log] [blame]
/*
* 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.
*/
package java.awt;
import java.awt.event.AWTEventListener;
import java.awt.event.AWTEventListenerProxy;
import java.awt.event.InputEvent;
import java.awt.im.InputMethodHighlight;
import java.awt.image.ColorModel;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import java.awt.peer.FontPeer;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Collections;
import java.util.EventListener;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.Properties;
import java.util.ResourceBundle;
import org.apache.harmony.awt.ChoiceStyle;
import org.apache.harmony.awt.ComponentInternals;
import org.apache.harmony.awt.ContextStorage;
import org.apache.harmony.awt.ReadOnlyIterator;
import org.apache.harmony.awt.internal.nls.Messages;
import org.apache.harmony.awt.wtk.CreationParams;
import org.apache.harmony.awt.wtk.GraphicsFactory;
import org.apache.harmony.awt.wtk.NativeCursor;
import org.apache.harmony.awt.wtk.NativeEventQueue;
import org.apache.harmony.awt.wtk.NativeEventThread;
import org.apache.harmony.awt.wtk.ShutdownWatchdog;
import org.apache.harmony.awt.wtk.Synchronizer;
import org.apache.harmony.awt.wtk.WTK;
import org.apache.harmony.luni.util.NotImplementedException;
/**
* The Toolkit class is the representation of the platform-specific Abstract
* Window Toolkit implementation. Toolkit's subclasses are used to bind the
* various components to particular native toolkit implementations.
*
* @since Android 1.0
*/
public abstract class Toolkit {
/**
* The Constant RECOURCE_PATH.
*/
private static final String RECOURCE_PATH = "org.apache.harmony.awt.resources.AWTProperties"; //$NON-NLS-1$
/**
* The Constant properties.
*/
private static final ResourceBundle properties = loadResources(RECOURCE_PATH);
/**
* The dispatcher.
*/
Dispatcher dispatcher;
/**
* The system event queue core.
*/
private EventQueueCore systemEventQueueCore;
/**
* The dispatch thread.
*/
EventDispatchThread dispatchThread;
/**
* The native thread.
*/
NativeEventThread nativeThread;
/**
* The AWT events manager.
*/
protected AWTEventsManager awtEventsManager;
/**
* The Class AWTTreeLock.
*/
private class AWTTreeLock {
}
/**
* The AWT tree lock.
*/
final Object awtTreeLock = new AWTTreeLock();
/**
* The synchronizer.
*/
private final Synchronizer synchronizer = ContextStorage.getSynchronizer();
/**
* The shutdown watchdog.
*/
final ShutdownWatchdog shutdownWatchdog = new ShutdownWatchdog();
/**
* The auto number.
*/
final AutoNumber autoNumber = new AutoNumber();
/**
* The event type lookup.
*/
final AWTEvent.EventTypeLookup eventTypeLookup = new AWTEvent.EventTypeLookup();
/**
* The b dynamic layout set.
*/
private boolean bDynamicLayoutSet = true;
/**
* The set of desktop properties that user set directly.
*/
private final HashSet<String> userPropSet = new HashSet<String>();
/**
* The desktop properties.
*/
protected Map<String, Object> desktopProperties;
/**
* The desktop props support.
*/
protected PropertyChangeSupport desktopPropsSupport;
/**
* For this component the native window is being created It is used in the
* callback-driven window creation (e.g. on Windows in the handler of
* WM_CREATE event) to establish the connection between this component and
* its native window.
*/
private Object recentNativeWindowComponent;
/**
* The wtk.
*/
private WTK wtk;
/**
* The Class ComponentInternalsImpl.
*
* @since Android 1.0
*/
protected final class ComponentInternalsImpl extends ComponentInternals {
/**
* Shutdown.
*/
@Override
public void shutdown() {
dispatchThread.shutdown();
}
/**
* Sets the desktop property to the specified value and fires a property
* change event.
*
* @param name
* the name of property.
* @param value
* the new value of property.
*/
@Override
public void setDesktopProperty(String name, Object value) {
Toolkit.this.setDesktopProperty(name, value);
}
}
/**
* A lot of methods must throw HeadlessException if
* <code>GraphicsEnvironment.isHeadless()</code> returns <code>true</code>.
*
* @throws HeadlessException
* the headless exception.
*/
static void checkHeadless() throws HeadlessException {
if (GraphicsEnvironment.getLocalGraphicsEnvironment().isHeadlessInstance())
throw new HeadlessException();
}
/**
* Lock AWT.
*/
final void lockAWT() {
synchronizer.lock();
}
/**
* Static lock AWT.
*/
static final void staticLockAWT() {
ContextStorage.getSynchronizer().lock();
}
/**
* Unlock AWT.
*/
final void unlockAWT() {
synchronizer.unlock();
}
/**
* Static unlock AWT.
*/
static final void staticUnlockAWT() {
ContextStorage.getSynchronizer().unlock();
}
/**
* InvokeAndWait under AWT lock. W/o this method system can hang up. Added
* to support modality (Dialog.show() & PopupMenu.show()) from not event
* dispatch thread. Use in other cases is not recommended. Still can be
* called only for whole API methods that cannot be called from other
* classes API methods. Examples: show() for modal dialogs - correct, only
* user can call it, directly or through setVisible(true) setBounds() for
* components - incorrect, setBounds() can be called from layoutContainer()
* for layout managers
*
* @param runnable
* the runnable.
* @throws InterruptedException
* the interrupted exception.
* @throws InvocationTargetException
* the invocation target exception.
*/
final void unsafeInvokeAndWait(Runnable runnable) throws InterruptedException,
InvocationTargetException {
synchronizer.storeStateAndFree();
try {
EventQueue.invokeAndWait(runnable);
} finally {
synchronizer.lockAndRestoreState();
}
}
/**
* Gets the synchronizer.
*
* @return the synchronizer.
*/
final Synchronizer getSynchronizer() {
return synchronizer;
}
/**
* Gets the wTK.
*
* @return the wTK.
*/
final WTK getWTK() {
return wtk;
}
/**
* Gets the property with the specified key and default value. This method
* returns the defValue if the property is not found.
*
* @param propName
* the name of property.
* @param defVal
* the default value.
* @return the property value.
*/
public static String getProperty(String propName, String defVal) {
if (propName == null) {
// awt.7D=Property name is null
throw new NullPointerException(Messages.getString("awt.7D")); //$NON-NLS-1$
}
staticLockAWT();
try {
String retVal = null;
if (properties != null) {
try {
retVal = properties.getString(propName);
} catch (MissingResourceException e) {
} catch (ClassCastException e) {
}
}
return (retVal == null) ? defVal : retVal;
} finally {
staticUnlockAWT();
}
}
/**
* Gets the default Toolkit.
*
* @return the default Toolkit.
*/
public static Toolkit getDefaultToolkit() {
synchronized (ContextStorage.getContextLock()) {
if (ContextStorage.shutdownPending()) {
return null;
}
Toolkit defToolkit = ContextStorage.getDefaultToolkit();
if (defToolkit != null) {
return defToolkit;
}
staticLockAWT();
try {
defToolkit = GraphicsEnvironment.isHeadless() ? new HeadlessToolkit()
: new ToolkitImpl();
ContextStorage.setDefaultToolkit(defToolkit);
return defToolkit;
} finally {
staticUnlockAWT();
}
// TODO: read system property named awt.toolkit
// and create an instance of the specified class,
// by default use ToolkitImpl
}
}
/**
* Gets the default Font.
*
* @return the default Font for Toolkit.
*/
Font getDefaultFont() {
return wtk.getSystemProperties().getDefaultFont();
}
/**
* Load resources.
*
* @param path
* the path.
* @return the resource bundle.
*/
private static ResourceBundle loadResources(String path) {
try {
return ResourceBundle.getBundle(path);
} catch (MissingResourceException e) {
return null;
}
}
/**
* Gets the wTK class name.
*
* @return the wTK class name.
*/
private static String getWTKClassName() {
return "com.android.internal.awt.AndroidWTK";
}
/**
* Gets the component by id.
*
* @param id
* the id.
* @return the component by id.
*/
Component getComponentById(long id) {
if (id == 0) {
return null;
}
return null;
}
/**
* Gets the GraphicsFactory.
*
* @return the GraphicsFactory object.
*/
public GraphicsFactory getGraphicsFactory() {
return wtk.getGraphicsFactory();
}
/**
* Instantiates a new toolkit.
*/
public Toolkit() {
init();
}
/**
* Initiates AWT.
*/
protected void init() {
lockAWT();
try {
ComponentInternals.setComponentInternals(new ComponentInternalsImpl());
new EventQueue(this); // create the system EventQueue
dispatcher = new Dispatcher(this);
final String className = getWTKClassName();
desktopProperties = new HashMap<String, Object>();
desktopPropsSupport = new PropertyChangeSupport(this);
awtEventsManager = new AWTEventsManager();
dispatchThread = new EventDispatchThread(this, dispatcher);
nativeThread = new NativeEventThread();
NativeEventThread.Init init = new NativeEventThread.Init() {
public WTK init() {
wtk = createWTK(className);
wtk.getNativeEventQueue().setShutdownWatchdog(shutdownWatchdog);
synchronizer.setEnvironment(wtk, dispatchThread);
ContextStorage.setWTK(wtk);
return wtk;
}
};
nativeThread.start(init);
dispatchThread.start();
wtk.getNativeEventQueue().awake();
} finally {
unlockAWT();
}
}
/**
* Synchronizes this toolkit's graphics.
*/
public abstract void sync();
/**
* Returns the construction status of a specified image that is being
* created.
*
* @param a0
* the image to be checked.
* @param a1
* the width of scaled image for which the status is being
* checked or -1.
* @param a2
* the height of scaled image for which the status is being
* checked or -1.
* @param a3
* the ImageObserver object to be notified while the image is
* being prepared.
* @return the ImageObserver flags which give the current state of the image
* data.
*/
public abstract int checkImage(Image a0, int a1, int a2, ImageObserver a3);
/**
* Creates the image with the specified ImageProducer.
*
* @param a0
* the ImageProducer to be used for image creation.
* @return the image with the specified ImageProducer.
*/
public abstract Image createImage(ImageProducer a0);
/**
* Creates the image from the specified byte array, offset and length. The
* byte array should contain data with image format supported by Toolkit
* such as JPEG, GIF, or PNG.
*
* @param a0
* the byte array with the image data.
* @param a1
* the offset of the beginning the image data in the byte array.
* @param a2
* the length of the image data in the byte array.
* @return the created Image.
*/
public abstract Image createImage(byte[] a0, int a1, int a2);
/**
* Creates the image using image data from the specified URL.
*
* @param a0
* the URL for extracting image data.
* @return the Image.
*/
public abstract Image createImage(URL a0);
/**
* Creates the image using image data from the specified file.
*
* @param a0
* the file name which contains image data of supported format.
* @return the Image.
*/
public abstract Image createImage(String a0);
/**
* Gets the color model.
*
* @return the ColorModel of Toolkit's screen.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
public abstract ColorModel getColorModel() throws HeadlessException;
/**
* Gets the screen device metrics for the specified font.
*
* @param font
* the Font.
* @return the FontMetrics for the specified Font.
* @deprecated Use getLineMetrics method from Font class.
*/
@Deprecated
public abstract FontMetrics getFontMetrics(Font font);
/**
* Prepares the specified image for rendering on the screen with the
* specified size.
*
* @param a0
* the Image to be prepared.
* @param a1
* the width of the screen representation or -1 for the current
* screen.
* @param a2
* the height of the screen representation or -1 for the current
* screen.
* @param a3
* the ImageObserver object to be notified as soon as the image
* is prepared.
* @return true, if image is fully prepared, false otherwise.
*/
public abstract boolean prepareImage(Image a0, int a1, int a2, ImageObserver a3);
/**
* Creates an audio beep.
*/
public abstract void beep();
/**
* Returns the array of font names which are available in this Toolkit.
*
* @return the array of font names which are available in this Toolkit.
* @deprecated use GraphicsEnvironment.getAvailableFontFamilyNames() method.
*/
@Deprecated
public abstract String[] getFontList();
/**
* Gets the the Font implementation using the specified peer interface.
*
* @param a0
* the Font name to be implemented.
* @param a1
* the the font style: PLAIN, BOLD, ITALIC.
* @return the FontPeer implementation of the specified Font.
* @deprecated use java.awt.GraphicsEnvironment.getAllFonts method.
*/
@Deprecated
protected abstract FontPeer getFontPeer(String a0, int a1);
/**
* Gets the image from the specified file which contains image data in a
* supported image format (such as JPEG, GIF, or PNG); this method should
* return the same Image for multiple calls of this method with the same
* image file name.
*
* @param a0
* the file name which contains image data in a supported image
* format (such as JPEG, GIF, or PNG).
* @return the Image.
*/
public abstract Image getImage(String a0);
/**
* Gets the image from the specified URL which contains image data in a
* supported image format (such as JPEG, GIF, or PNG); this method should
* return the same Image for multiple calls of this method with the same
* image URL.
*
* @param a0
* the URL which contains image data in a supported image format
* (such as JPEG, GIF, or PNG).
* @return the Image.
*/
public abstract Image getImage(URL a0);
/**
* Gets the screen resolution.
*
* @return the screen resolution.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
public abstract int getScreenResolution() throws HeadlessException;
/**
* Gets the screen size.
*
* @return a Dimension object containing the width and height of the screen.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
public abstract Dimension getScreenSize() throws HeadlessException;
/**
* Gets the EventQueue instance without checking access.
*
* @return the system EventQueue.
*/
protected abstract EventQueue getSystemEventQueueImpl();
/**
* Returns a map of text attributes for the abstract level description of
* the specified input method highlight, or null if no mapping is found.
*
* @param highlight
* the InputMethodHighlight.
* @return the Map<java.awt.font. text attribute,?>.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
public abstract Map<java.awt.font.TextAttribute, ?> mapInputMethodHighlight(
InputMethodHighlight highlight) throws HeadlessException;
/**
* Map input method highlight impl.
*
* @param highlight
* the highlight.
* @return the map<java.awt.font. text attribute,?>.
* @throws HeadlessException
* the headless exception.
*/
Map<java.awt.font.TextAttribute, ?> mapInputMethodHighlightImpl(InputMethodHighlight highlight)
throws HeadlessException {
HashMap<java.awt.font.TextAttribute, ?> map = new HashMap<java.awt.font.TextAttribute, Object>();
wtk.getSystemProperties().mapInputMethodHighlight(highlight, map);
return Collections.<java.awt.font.TextAttribute, Object> unmodifiableMap(map);
}
/**
* Adds the specified PropertyChangeListener listener for the specified
* property.
*
* @param propName
* the property name for which the specified
* PropertyChangeListener will be added.
* @param l
* the PropertyChangeListener object.
*/
public void addPropertyChangeListener(String propName, PropertyChangeListener l) {
lockAWT();
try {
if (desktopProperties.isEmpty()) {
initializeDesktopProperties();
}
} finally {
unlockAWT();
}
if (l != null) { // there is no guarantee that null listener will not be
// added
desktopPropsSupport.addPropertyChangeListener(propName, l);
}
}
/**
* Returns an array of the property change listeners registered with this
* Toolkit.
*
* @return an array of the property change listeners registered with this
* Toolkit.
*/
public PropertyChangeListener[] getPropertyChangeListeners() {
return desktopPropsSupport.getPropertyChangeListeners();
}
/**
* Returns an array of the property change listeners registered with this
* Toolkit for notification regarding the specified property.
*
* @param propName
* the property name for which the PropertyChangeListener was
* registered.
* @return the array of PropertyChangeListeners registered for the specified
* property name.
*/
public PropertyChangeListener[] getPropertyChangeListeners(String propName) {
return desktopPropsSupport.getPropertyChangeListeners(propName);
}
/**
* Removes the specified property change listener registered for the
* specified property name.
*
* @param propName
* the property name.
* @param l
* the PropertyChangeListener registered for the specified
* property name.
*/
public void removePropertyChangeListener(String propName, PropertyChangeListener l) {
desktopPropsSupport.removePropertyChangeListener(propName, l);
}
/**
* Creates a custom cursor with the specified Image, hot spot, and cursor
* description.
*
* @param img
* the image of activated cursor.
* @param hotSpot
* the Point giving the coordinates of the cursor's hot spot.
* @param name
* the cursor description.
* @return the cursor with the specified Image, hot spot, and cursor
* description.
* @throws IndexOutOfBoundsException
* if the hot spot values are outside the bounds of the cursor.
* @throws HeadlessException
* if isHeadless() method of GraphicsEnvironment class returns
* true.
*/
public Cursor createCustomCursor(Image img, Point hotSpot, String name)
throws IndexOutOfBoundsException, HeadlessException {
lockAWT();
try {
int w = img.getWidth(null), x = hotSpot.x;
int h = img.getHeight(null), y = hotSpot.y;
if (x < 0 || x >= w || y < 0 || y >= h) {
// awt.7E=invalid hotSpot
throw new IndexOutOfBoundsException(Messages.getString("awt.7E")); //$NON-NLS-1$
}
return new Cursor(name, img, hotSpot);
} finally {
unlockAWT();
}
}
/**
* Returns the supported cursor dimension which is closest to the specified
* width and height. If the Toolkit only supports a single cursor size, this
* method should return the supported cursor size. If custom cursor is not
* supported, a dimension of 0, 0 should be returned.
*
* @param prefWidth
* the preferred cursor width.
* @param prefHeight
* the preferred cursor height.
* @return the supported cursor dimension which is closest to the specified
* width and height.
* @throws HeadlessException
* if GraphicsEnvironment.isHeadless() returns true.
*/
public Dimension getBestCursorSize(int prefWidth, int prefHeight) throws HeadlessException {
lockAWT();
try {
return wtk.getCursorFactory().getBestCursorSize(prefWidth, prefHeight);
} finally {
unlockAWT();
}
}
/**
* Gets the value for the specified desktop property.
*
* @param propName
* the property name.
* @return the Object that is the property's value.
*/
public final Object getDesktopProperty(String propName) {
lockAWT();
try {
if (desktopProperties.isEmpty()) {
initializeDesktopProperties();
}
if (propName.equals("awt.dynamicLayoutSupported")) { //$NON-NLS-1$
// dynamicLayoutSupported is special case
return Boolean.valueOf(isDynamicLayoutActive());
}
Object val = desktopProperties.get(propName);
if (val == null) {
// try to lazily load prop value
// just for compatibility, our lazilyLoad is empty
val = lazilyLoadDesktopProperty(propName);
}
return val;
} finally {
unlockAWT();
}
}
/**
* Returns the locking key state for the specified key.
*
* @param a0
* the key code: VK_CAPS_LOCK, VK_NUM_LOCK, VK_SCROLL_LOCK, or
* VK_KANA_LOCK.
* @return true if the specified key code is in the locked state, false
* otherwise.
* @throws UnsupportedOperationException
* if the state of this key can't be retrieved, or if the
* keyboard doesn't have this key.
* @throws NotImplementedException
* if this method is not implemented.
*/
public boolean getLockingKeyState(int a0) throws UnsupportedOperationException,
org.apache.harmony.luni.util.NotImplementedException {
lockAWT();
try {
} finally {
unlockAWT();
}
if (true) {
throw new RuntimeException("Method is not implemented"); //TODO: implement //$NON-NLS-1$
}
return true;
}
/**
* Returns the maximum number of colors which the Toolkit supports for
* custom cursor.
*
* @return the maximum cursor colors.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
public int getMaximumCursorColors() throws HeadlessException {
lockAWT();
try {
return wtk.getCursorFactory().getMaximumCursorColors();
} finally {
unlockAWT();
}
}
/**
* Gets the menu shortcut key mask.
*
* @return the menu shortcut key mask.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
public int getMenuShortcutKeyMask() throws HeadlessException {
lockAWT();
try {
return InputEvent.CTRL_MASK;
} finally {
unlockAWT();
}
}
/**
* Gets the screen insets.
*
* @param gc
* the GraphicsConfiguration.
* @return the insets of this toolkit.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
public Insets getScreenInsets(GraphicsConfiguration gc) throws HeadlessException {
if (gc == null) {
throw new NullPointerException();
}
lockAWT();
try {
return new Insets(0, 0, 0, 0); // TODO: get real screen insets
} finally {
unlockAWT();
}
}
/**
* Gets the system EventQueue instance. If the default implementation of
* checkAwtEventQueueAccess is used, then this results of a call to the
* security manager's checkPermission method with an
* AWTPermission("accessEventQueue") permission.
*
* @return the system EventQueue instance.
*/
public final EventQueue getSystemEventQueue() {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkAwtEventQueueAccess();
}
return getSystemEventQueueImpl();
}
/**
* Gets the system event queue core.
*
* @return the system event queue core.
*/
EventQueueCore getSystemEventQueueCore() {
return systemEventQueueCore;
}
/**
* Sets the system event queue core.
*
* @param core
* the new system event queue core.
*/
void setSystemEventQueueCore(EventQueueCore core) {
systemEventQueueCore = core;
}
/**
* Initialize the desktop properties.
*/
protected void initializeDesktopProperties() {
lockAWT();
try {
wtk.getSystemProperties().init(desktopProperties);
} finally {
unlockAWT();
}
}
/**
* Checks if dynamic layout of Containers is active or not.
*
* @return true, if is dynamic layout of Containers is active, false
* otherwise.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
public boolean isDynamicLayoutActive() throws HeadlessException {
lockAWT();
try {
// always return true
return true;
} finally {
unlockAWT();
}
}
/**
* Returns if the layout of Containers is checked dynamically during
* resizing, or statically after resizing is completed.
*
* @return true, if if the layout of Containers is checked dynamically
* during resizing; false, if the layout of Containers is checked
* statically after resizing is completed.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
protected boolean isDynamicLayoutSet() throws HeadlessException {
lockAWT();
try {
return bDynamicLayoutSet;
} finally {
unlockAWT();
}
}
/**
* Checks if the specified frame state is supported by Toolkit or not.
*
* @param state
* the frame state.
* @return true, if frame state is supported, false otherwise.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
public boolean isFrameStateSupported(int state) throws HeadlessException {
lockAWT();
try {
return wtk.getWindowFactory().isWindowStateSupported(state);
} finally {
unlockAWT();
}
}
/**
* Loads the value of the desktop property with the specified property name.
*
* @param propName
* the property name.
* @return the desktop property values.
*/
protected Object lazilyLoadDesktopProperty(String propName) {
return null;
}
/**
* Loads the current system color values to the specified array.
*
* @param colors
* the array where the current system color values are written by
* this method.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
protected void loadSystemColors(int[] colors) throws HeadlessException {
lockAWT();
try {
} finally {
unlockAWT();
}
}
/**
* Sets the value of the desktop property with the specified name.
*
* @param propName
* the property's name.
* @param value
* the property's value.
*/
protected final void setDesktopProperty(String propName, Object value) {
Object oldVal;
lockAWT();
try {
oldVal = getDesktopProperty(propName);
userPropSet.add(propName);
desktopProperties.put(propName, value);
} finally {
unlockAWT();
}
desktopPropsSupport.firePropertyChange(propName, oldVal, value);
}
/**
* Sets the layout state, whether the Container layout is checked
* dynamically during resizing, or statically after resizing is completed.
*
* @param dynamic
* the new dynamic layout state - if true the layout of
* Containers is checked dynamically during resizing, if false -
* statically after resizing is completed.
* @throws HeadlessException
* if the GraphicsEnvironment.isHeadless() method returns true.
*/
public void setDynamicLayout(boolean dynamic) throws HeadlessException {
lockAWT();
try {
bDynamicLayoutSet = dynamic;
} finally {
unlockAWT();
}
}
/**
* Sets the locking key state for the specified key code.
*
* @param a0
* the key code: VK_CAPS_LOCK, VK_NUM_LOCK, VK_SCROLL_LOCK, or
* VK_KANA_LOCK.
* @param a1
* the state - true to set the specified key code to the locked
* state, false - to unlock it.
* @throws UnsupportedOperationException
* if the state of this key can't be set, or if the keyboard
* doesn't have this key.
* @throws NotImplementedException
* if this method is not implemented.
*/
public void setLockingKeyState(int a0, boolean a1) throws UnsupportedOperationException,
org.apache.harmony.luni.util.NotImplementedException {
lockAWT();
try {
} finally {
unlockAWT();
}
if (true) {
throw new RuntimeException("Method is not implemented"); //TODO: implement //$NON-NLS-1$
}
return;
}
/**
* On queue empty.
*/
void onQueueEmpty() {
throw new RuntimeException("Not implemented!");
}
/**
* Creates the wtk.
*
* @param clsName
* the cls name.
* @return the wTK.
*/
private WTK createWTK(String clsName) {
WTK newWTK = null;
try {
newWTK = (WTK)Class.forName(clsName).newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
return newWTK;
}
/**
* Connect the component to its native window
*
* @param winId
* the id of native window just created.
*/
boolean onWindowCreated(long winId) {
return false;
}
/**
* Gets the native event queue.
*
* @return the native event queue.
*/
NativeEventQueue getNativeEventQueue() {
return wtk.getNativeEventQueue();
}
/**
* Returns a shared instance of implementation of
* org.apache.harmony.awt.wtk.NativeCursor for current platform for.
*
* @param type
* the Java Cursor type.
* @return new instance of implementation of NativeCursor.
*/
NativeCursor createNativeCursor(int type) {
return wtk.getCursorFactory().getCursor(type);
}
/**
* Returns a shared instance of implementation of
* org.apache.harmony.awt.wtk.NativeCursor for current platform for custom
* cursor
*
* @param img
* the img.
* @param hotSpot
* the hot spot.
* @param name
* the name.
* @return new instance of implementation of NativeCursor.
*/
NativeCursor createCustomNativeCursor(Image img, Point hotSpot, String name) {
return wtk.getCursorFactory().createCustomCursor(img, hotSpot.x, hotSpot.y);
}
/**
* Adds an AWTEventListener to the Toolkit to listen for events of types
* corresponding to bits in the specified event mask. Event masks are
* defined in AWTEvent class.
*
* @param listener
* the AWTEventListener.
* @param eventMask
* the bitmask of event types.
*/
public void addAWTEventListener(AWTEventListener listener, long eventMask) {
lockAWT();
try {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkPermission(awtEventsManager.permission);
}
awtEventsManager.addAWTEventListener(listener, eventMask);
} finally {
unlockAWT();
}
}
/**
* Removes the specified AWT event listener.
*
* @param listener
* the AWTEventListener to be removed.
*/
public void removeAWTEventListener(AWTEventListener listener) {
lockAWT();
try {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkPermission(awtEventsManager.permission);
}
awtEventsManager.removeAWTEventListener(listener);
} finally {
unlockAWT();
}
}
/**
* Gets the array of all AWT event listeners registered with this Toolkit.
*
* @return the array of all AWT event listeners registered with this
* Toolkit.
*/
public AWTEventListener[] getAWTEventListeners() {
lockAWT();
try {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkPermission(awtEventsManager.permission);
}
return awtEventsManager.getAWTEventListeners();
} finally {
unlockAWT();
}
}
/**
* Returns the array of the AWT event listeners registered with this Toolkit
* for the event types corresponding to the specified event mask.
*
* @param eventMask
* the bit mask of event type.
* @return the array of the AWT event listeners registered in this Toolkit
* for the event types corresponding to the specified event mask.
*/
public AWTEventListener[] getAWTEventListeners(long eventMask) {
lockAWT();
try {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkPermission(awtEventsManager.permission);
}
return awtEventsManager.getAWTEventListeners(eventMask);
} finally {
unlockAWT();
}
}
/**
* Dispatch AWT event.
*
* @param event
* the event.
*/
void dispatchAWTEvent(AWTEvent event) {
awtEventsManager.dispatchAWTEvent(event);
}
/**
* The Class AWTEventsManager.
*/
final class AWTEventsManager {
/**
* The permission.
*/
AWTPermission permission = new AWTPermission("listenToAllAWTEvents"); //$NON-NLS-1$
/**
* The listeners.
*/
private final AWTListenerList<AWTEventListenerProxy> listeners = new AWTListenerList<AWTEventListenerProxy>();
/**
* Adds the AWT event listener.
*
* @param listener
* the listener.
* @param eventMask
* the event mask.
*/
void addAWTEventListener(AWTEventListener listener, long eventMask) {
if (listener != null) {
listeners.addUserListener(new AWTEventListenerProxy(eventMask, listener));
}
}
/**
* Removes the AWT event listener.
*
* @param listener
* the listener.
*/
void removeAWTEventListener(AWTEventListener listener) {
if (listener != null) {
for (AWTEventListenerProxy proxy : listeners.getUserListeners()) {
if (listener == proxy.getListener()) {
listeners.removeUserListener(proxy);
return;
}
}
}
}
/**
* Gets the AWT event listeners.
*
* @return the AWT event listeners.
*/
AWTEventListener[] getAWTEventListeners() {
HashSet<EventListener> listenersSet = new HashSet<EventListener>();
for (AWTEventListenerProxy proxy : listeners.getUserListeners()) {
listenersSet.add(proxy.getListener());
}
return listenersSet.toArray(new AWTEventListener[listenersSet.size()]);
}
/**
* Gets the AWT event listeners.
*
* @param eventMask
* the event mask.
* @return the AWT event listeners.
*/
AWTEventListener[] getAWTEventListeners(long eventMask) {
HashSet<EventListener> listenersSet = new HashSet<EventListener>();
for (AWTEventListenerProxy proxy : listeners.getUserListeners()) {
if ((proxy.getEventMask() & eventMask) == eventMask) {
listenersSet.add(proxy.getListener());
}
}
return listenersSet.toArray(new AWTEventListener[listenersSet.size()]);
}
/**
* Dispatch AWT event.
*
* @param event
* the event.
*/
void dispatchAWTEvent(AWTEvent event) {
AWTEvent.EventDescriptor descriptor = eventTypeLookup.getEventDescriptor(event);
if (descriptor == null) {
return;
}
for (AWTEventListenerProxy proxy : listeners.getUserListeners()) {
if ((proxy.getEventMask() & descriptor.eventMask) != 0) {
proxy.eventDispatched(event);
}
}
}
}
/**
* The Class AutoNumber.
*/
static final class AutoNumber {
/**
* The next component.
*/
int nextComponent = 0;
/**
* The next canvas.
*/
int nextCanvas = 0;
/**
* The next panel.
*/
int nextPanel = 0;
/**
* The next window.
*/
int nextWindow = 0;
/**
* The next frame.
*/
int nextFrame = 0;
/**
* The next dialog.
*/
int nextDialog = 0;
/**
* The next button.
*/
int nextButton = 0;
/**
* The next menu component.
*/
int nextMenuComponent = 0;
/**
* The next label.
*/
int nextLabel = 0;
/**
* The next check box.
*/
int nextCheckBox = 0;
/**
* The next scrollbar.
*/
int nextScrollbar = 0;
/**
* The next scroll pane.
*/
int nextScrollPane = 0;
/**
* The next list.
*/
int nextList = 0;
/**
* The next choice.
*/
int nextChoice = 0;
/**
* The next file dialog.
*/
int nextFileDialog = 0;
/**
* The next text area.
*/
int nextTextArea = 0;
/**
* The next text field.
*/
int nextTextField = 0;
}
private class Lock {
}
/**
* The lock.
*/
private final Object lock = new Lock();
}