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 Pavel Dolgov
019: * @version $Revision$
020: */package org.apache.harmony.awt;
021:
022: import java.awt.*;
023:
024: import org.apache.harmony.awt.datatransfer.*;
025: import org.apache.harmony.awt.internal.nls.Messages;
026: import org.apache.harmony.awt.wtk.*;
027:
028: public final class ContextStorage {
029:
030: private static volatile boolean multiContextMode = false;
031: private volatile boolean shutdownPending = false;
032:
033: private static final ContextStorage globalContext = new ContextStorage();
034:
035: private Toolkit toolkit;
036: private ComponentInternals componentInternals;
037: private DTK dtk;
038: private WTK wtk;
039: private GraphicsEnvironment graphicsEnvironment;
040:
041: private class ContextLock {
042: }
043:
044: private final Object contextLock = new ContextLock();
045: private final Synchronizer synchronizer = new Synchronizer();
046:
047: public static void activateMultiContextMode() {
048: // TODO: checkPermission
049: multiContextMode = true;
050: }
051:
052: public static void setDefaultToolkit(Toolkit newToolkit) {
053: // TODO: checkPermission
054:
055: getCurrentContext().toolkit = newToolkit;
056: }
057:
058: public static Toolkit getDefaultToolkit() {
059: return getCurrentContext().toolkit;
060: }
061:
062: public static void setDTK(DTK dtk) {
063: // TODO: checkPermission
064: getCurrentContext().dtk = dtk;
065: }
066:
067: public static DTK getDTK() {
068: return getCurrentContext().dtk;
069: }
070:
071: public static Synchronizer getSynchronizer() {
072: return getCurrentContext().synchronizer;
073: }
074:
075: public static ComponentInternals getComponentInternals() {
076: return getCurrentContext().componentInternals;
077: }
078:
079: static void setComponentInternals(ComponentInternals internals) {
080: // TODO: checkPermission
081: getCurrentContext().componentInternals = internals;
082: }
083:
084: public static Object getContextLock() {
085: return getCurrentContext().contextLock;
086: }
087:
088: public static WindowFactory getWindowFactory() {
089: return getCurrentContext().wtk.getWindowFactory();
090: }
091:
092: public static void setWTK(WTK wtk) {
093: getCurrentContext().wtk = wtk;
094: }
095:
096: public static NativeIM getNativeIM() {
097: return getCurrentContext().wtk.getNativeIM();
098: }
099:
100: public static NativeEventQueue getNativeEventQueue() {
101: return getCurrentContext().wtk.getNativeEventQueue();
102: }
103:
104: public static GraphicsEnvironment getGraphicsEnvironment() {
105: return getCurrentContext().graphicsEnvironment;
106: }
107:
108: public static void setGraphicsEnvironment(
109: GraphicsEnvironment environment) {
110: getCurrentContext().graphicsEnvironment = environment;
111: }
112:
113: private static ContextStorage getCurrentContext() {
114: return multiContextMode ? getContextThreadGroup().context
115: : globalContext;
116: }
117:
118: private static ContextThreadGroup getContextThreadGroup() {
119:
120: Thread thread = Thread.currentThread();
121: ThreadGroup group = thread.getThreadGroup();
122: while (group != null) {
123: if (group instanceof ContextThreadGroup) {
124: return (ContextThreadGroup) group;
125: }
126: group = group.getParent();
127: }
128: // awt.59=Application has run out of context thread group
129: throw new RuntimeException(Messages.getString("awt.59")); //$NON-NLS-1$
130: }
131:
132: public static boolean shutdownPending() {
133: return getCurrentContext().shutdownPending;
134: }
135:
136: void shutdown() {
137: if (!multiContextMode) {
138: return;
139: }
140: shutdownPending = true;
141:
142: componentInternals.shutdown();
143:
144: synchronized (contextLock) {
145: toolkit = null;
146: componentInternals = null;
147: dtk = null;
148: wtk = null;
149: graphicsEnvironment = null;
150: }
151: }
152: }
|