LWToolkit.java revision 4665
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon/*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This code is free software; you can redistribute it and/or modify it
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * under the terms of the GNU General Public License version 2 only, as
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * published by the Free Software Foundation. Oracle designates this
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * particular file as subject to the "Classpath" exception as provided
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * by Oracle in the LICENSE file that accompanied this code.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This code is distributed in the hope that it will be useful, but WITHOUT
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * version 2 for more details (a copy is included in the LICENSE file that
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * accompanied this code).
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * You should have received a copy of the GNU General Public License version
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * 2 along with this work; if not, write to the Free Software Foundation,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * or visit www.oracle.com if you need additional information or have any
66cd0f60c3182913d379abb730ae755bf6367126Kacheong Poon * questions.
633fc3a6eed35d918db16925b7048d7a2e28064aSebastien Roy */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonpackage sun.lwawt;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport java.awt.*;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport java.awt.List;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport java.awt.datatransfer.*;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport java.awt.dnd.*;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport java.awt.dnd.peer.*;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport java.awt.image.*;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport java.awt.peer.*;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport java.security.*;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport java.util.*;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport sun.awt.*;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport sun.lwawt.macosx.*;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonimport sun.print.*;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poonpublic abstract class LWToolkit extends SunToolkit implements Runnable {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private final static int STATE_NONE = 0;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private final static int STATE_INIT = 1;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private final static int STATE_MESSAGELOOP = 2;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private final static int STATE_SHUTDOWN = 3;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private final static int STATE_CLEANUP = 4;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private final static int STATE_DONE = 5;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private int runState = STATE_NONE;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private Clipboard clipboard;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private MouseInfoPeer mouseInfoPeer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private static Map<PlatformWindow, LWWindowPeer> delegateMap =
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon new HashMap<PlatformWindow, LWWindowPeer>();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public LWToolkit() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This method is called by subclasses to start this toolkit
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * by launching the message loop.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This method waits for the toolkit to be completely initialized
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * and returns before the message pump is started.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected final void init() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon AWTAutoShutdown.notifyToolkitThreadBusy();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon ThreadGroup mainTG = AccessController.doPrivileged(
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon new PrivilegedAction<ThreadGroup>() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ThreadGroup run() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon ThreadGroup currentTG = Thread.currentThread().getThreadGroup();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon ThreadGroup parentTG = currentTG.getParent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon while (parentTG != null) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon currentTG = parentTG;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon parentTG = currentTG.getParent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return currentTG;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon );
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon Runtime.getRuntime().addShutdownHook(
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon new Thread(mainTG, new Runnable() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public void run() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon shutdown();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon waitForRunState(STATE_CLEANUP);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon })
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon );
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon Thread toolkitThread = new Thread(mainTG, this, "AWT-LW");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon toolkitThread.setDaemon(true);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon toolkitThread.setPriority(Thread.NORM_PRIORITY + 1);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon toolkitThread.start();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon waitForRunState(STATE_MESSAGELOOP);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Implemented in subclasses to initialize platform-dependent
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * part of the toolkit (open X display connection, create
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * toolkit HWND, etc.)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This method is called on the toolkit thread.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract void platformInit();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Sends a request to stop the message pump.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public void shutdown() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon setRunState(STATE_SHUTDOWN);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon platformShutdown();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Implemented in subclasses to release all the platform-
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * dependent resources. Called after the message loop is
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * terminated.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Could be called (always called?) on a non-toolkit thread.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract void platformShutdown();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Implemented in subclasses to release all the platform
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * resources before the application is terminated.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * This method is called on the toolkit thread.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract void platformCleanup();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private synchronized int getRunState() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return runState;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private synchronized void setRunState(int state) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon runState = state;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon notifyAll();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public boolean isTerminating() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return getRunState() >= STATE_SHUTDOWN;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private void waitForRunState(int state) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon while (getRunState() < state) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon try {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon synchronized (this) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon wait();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon } catch (InterruptedException z) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // TODO: log
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon break;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public void run() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon setRunState(STATE_INIT);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon platformInit();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon AWTAutoShutdown.notifyToolkitThreadFree();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon setRunState(STATE_MESSAGELOOP);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon while (getRunState() < STATE_SHUTDOWN) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon try {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon platformRunMessage();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (Thread.currentThread().isInterrupted()) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (AppContext.getAppContext().isDisposed()) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon break;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon } catch (ThreadDeath td) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon //XXX: if there isn't native code on the stack, the VM just
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon //kills the thread right away. Do we expect to catch it
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon //nevertheless?
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon break;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon } catch (Throwable t) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // TODO: log
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon System.err.println("Exception on the toolkit thread");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon t.printStackTrace(System.err);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon //XXX: if that's a secondary loop, jump back to the STATE_MESSAGELOOP
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon setRunState(STATE_CLEANUP);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon AWTAutoShutdown.notifyToolkitThreadFree();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon platformCleanup();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon setRunState(STATE_DONE);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Process the next message(s) from the native event queue.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon *
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Initially, all the LWToolkit implementations were supposed
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * to have the similar message loop sequence: check if any events
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * available, peek events, wait. However, the later analysis shown
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * that X11 and Windows implementations are really different, so
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * let the subclasses do whatever they require.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract void platformRunMessage();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public static LWToolkit getLWToolkit() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return (LWToolkit)Toolkit.getDefaultToolkit();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // ---- TOPLEVEL PEERS ---- //
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Note that LWWindowPeer implements WindowPeer, FramePeer
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * and DialogPeer interfaces.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon private LWWindowPeer createDelegatedPeer(Window target, PlatformComponent platformComponent,
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformWindow platformWindow)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWWindowPeer peer = new LWWindowPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetDelegate(platformWindow, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public WindowPeer createWindow(Window target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.SIMPLEWINDOW);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return createDelegatedPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public FramePeer createFrame(Frame target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.FRAME);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return createDelegatedPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public LWWindowPeer createEmbeddedFrame(CEmbeddedFrame target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.EMBEDDEDFRAME);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return createDelegatedPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon CPrinterDialogPeer createCPrinterDialog(CPrinterDialog target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.DIALOG);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon CPrinterDialogPeer peer = new CPrinterDialogPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public DialogPeer createDialog(Dialog target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (target instanceof CPrinterDialog) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return createCPrinterDialog((CPrinterDialog)target);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.DIALOG);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return createDelegatedPeer(target, platformComponent, platformWindow);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public FileDialogPeer createFileDialog(FileDialog target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon FileDialogPeer peer = createFileDialogPeer(target);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // ---- LIGHTWEIGHT COMPONENT PEERS ---- //
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ButtonPeer createButton(Button target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWButtonPeer peer = new LWButtonPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public CheckboxPeer createCheckbox(Checkbox target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWCheckboxPeer peer = new LWCheckboxPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public CheckboxMenuItemPeer createCheckboxMenuItem(CheckboxMenuItem target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ChoicePeer createChoice(Choice target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWChoicePeer peer = new LWChoicePeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public LabelPeer createLabel(Label target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWLabelPeer peer = new LWLabelPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public CanvasPeer createCanvas(Canvas target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWCanvasPeer peer = new LWCanvasPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ListPeer createList(List target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWListPeer peer = new LWListPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public MenuPeer createMenu(Menu target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public MenuBarPeer createMenuBar(MenuBar target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public MenuItemPeer createMenuItem(MenuItem target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public PanelPeer createPanel(Panel target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWPanelPeer peer = new LWPanelPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public PopupMenuPeer createPopupMenu(PopupMenu target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ScrollPanePeer createScrollPane(ScrollPane target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWScrollPanePeer peer = new LWScrollPanePeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ScrollbarPeer createScrollbar(Scrollbar target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWScrollBarPeer peer = new LWScrollBarPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public TextAreaPeer createTextArea(TextArea target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWTextAreaPeer peer = new LWTextAreaPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public TextFieldPeer createTextField(TextField target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PlatformComponent platformComponent = createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon LWTextFieldPeer peer = new LWTextFieldPeer(target, platformComponent);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon targetCreatedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon peer.initialize();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return peer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // ---- NON-COMPONENT PEERS ---- //
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public ColorModel getColorModel() throws HeadlessException {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().getColorModel();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public boolean isDesktopSupported() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return true;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected DesktopPeer createDesktopPeer(Desktop target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return new CDesktopPeer();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public DragSourceContextPeer createDragSourceContextPeer(DragGestureEvent dge) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon DragSourceContextPeer dscp = CDragSourceContextPeer.createDragSourceContextPeer(dge);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return dscp;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return LWKeyboardFocusManagerPeer.getInstance(manager);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public synchronized MouseInfoPeer getMouseInfoPeer() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (mouseInfoPeer == null) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon mouseInfoPeer = createMouseInfoPeerImpl();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return mouseInfoPeer;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected MouseInfoPeer createMouseInfoPeerImpl() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return new LWMouseInfoPeer();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public PrintJob getPrintJob(Frame frame, String doctitle, Properties props) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return getPrintJob(frame, doctitle, null, null);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public PrintJob getPrintJob(Frame frame, String doctitle, JobAttributes jobAttributes, PageAttributes pageAttributes) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (GraphicsEnvironment.isHeadless()) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new IllegalArgumentException();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon PrintJob2D printJob = new PrintJob2D(frame, doctitle, jobAttributes, pageAttributes);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (printJob.printDialog() == false) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon printJob = null;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return printJob;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public RobotPeer createRobot(Robot target, GraphicsDevice screen) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public boolean isTraySupported() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public SystemTrayPeer createSystemTray(SystemTray target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public TrayIconPeer createTrayIcon(TrayIcon target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon throw new RuntimeException("not implemented");
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public Clipboard getSystemClipboard() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon SecurityManager security = System.getSecurityManager();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (security != null) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon security.checkSystemClipboardAccess();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon synchronized (this) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (clipboard == null) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon clipboard = createPlatformClipboard();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return clipboard;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // ---- DELEGATES ---- //
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public abstract Clipboard createPlatformClipboard();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Creates a delegate for the given peer type (window, frame, dialog, etc.)
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract PlatformWindow createPlatformWindow(LWWindowPeer.PeerType peerType);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract PlatformComponent createPlatformComponent();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon protected abstract FileDialogPeer createFileDialogPeer(FileDialog target);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public static void targetDelegate(PlatformWindow delegate, LWWindowPeer peer) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon delegateMap.put(delegate, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public static LWWindowPeer delegateToPeer(PlatformWindow delegate) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return delegateMap.get(delegate);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // ---- UTILITY METHODS ---- //
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Expose non-public targetToPeer() method.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public final static Object targetToPeer(Object target) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return SunToolkit.targetToPeer(target);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Expose non-public targetDisposedPeer() method.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public final static void targetDisposedPeer(Object target, Object peer) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon SunToolkit.targetDisposedPeer(target, peer);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon /*
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon * Returns the current cursor manager.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon */
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public abstract LWCursorManager getCursorManager();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public static void postEvent(AWTEvent event) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon postEvent(targetToAppContext(event.getSource()), event);
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon // use peer's back buffer to implement non-opaque windows.
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public boolean needUpdateWindow() {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon return true;
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public void grab(Window w) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (w.getPeer() != null) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon ((LWWindowPeer)w.getPeer()).grab();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon @Override
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon public void ungrab(Window w) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon if (w.getPeer() != null) {
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon ((LWWindowPeer)w.getPeer()).ungrab();
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon }
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon}
721fffe35d40e548a5a58dc53a2ec9c6762172d9Kacheong Poon