summaryrefslogtreecommitdiffstats
path: root/awt/org/apache/harmony/awt/ContextStorage.java
blob: d44648aa3b1acb00345c6bb38edf0807c1fb8b09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
 *  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 Pavel Dolgov
 * @version $Revision$
 */
package org.apache.harmony.awt;

import java.awt.*;

//???AWT
//import org.apache.harmony.awt.datatransfer.*;
import org.apache.harmony.awt.internal.nls.Messages;
import org.apache.harmony.awt.wtk.*;


public final class ContextStorage {

    private static volatile boolean multiContextMode = false;
    private volatile boolean shutdownPending = false;

    private static final ContextStorage globalContext = new ContextStorage();

    private Toolkit toolkit;
    private ComponentInternals componentInternals;
    //???AWT: private DTK dtk;
    private WTK wtk;
    private GraphicsEnvironment graphicsEnvironment;

    private class ContextLock {}
    private final Object contextLock = new ContextLock();
    private final Synchronizer synchronizer = new Synchronizer();

    public static void activateMultiContextMode() {
        // TODO: checkPermission
        multiContextMode = true;
    }

    public static void setDefaultToolkit(Toolkit newToolkit) {
        // TODO: checkPermission
        getCurrentContext().toolkit = newToolkit;
    }

    public static Toolkit getDefaultToolkit() {
        return getCurrentContext().toolkit;
    }

    //???AWT
    /*
    public static void setDTK(DTK dtk) {
        // TODO: checkPermission
        getCurrentContext().dtk = dtk;
    }

    public static DTK getDTK() {
        return getCurrentContext().dtk;
    }
    */

    public static Synchronizer getSynchronizer() {
        return getCurrentContext().synchronizer;
    }

    public static ComponentInternals getComponentInternals() {
        return getCurrentContext().componentInternals;
    }

    static void setComponentInternals(ComponentInternals internals) {
        // TODO: checkPermission
        getCurrentContext().componentInternals = internals;
    }

    public static Object getContextLock() {
        return getCurrentContext().contextLock;
    }

    public static WindowFactory getWindowFactory() {
        return getCurrentContext().wtk.getWindowFactory();
    }

    public static void setWTK(WTK wtk) {
        getCurrentContext().wtk = wtk;
    }

    public static NativeIM getNativeIM() {
        return getCurrentContext().wtk.getNativeIM();
    }

    public static NativeEventQueue getNativeEventQueue() {
        return getCurrentContext().wtk.getNativeEventQueue();
    }

    public static GraphicsEnvironment getGraphicsEnvironment() {
        return getCurrentContext().graphicsEnvironment;
    }

    public static void setGraphicsEnvironment(GraphicsEnvironment environment) {
        getCurrentContext().graphicsEnvironment = environment;
    }

    private static ContextStorage getCurrentContext() {
        return multiContextMode ? getContextThreadGroup().context : globalContext;
    }

    private static ContextThreadGroup getContextThreadGroup() {

        Thread thread = Thread.currentThread();
        ThreadGroup group = thread.getThreadGroup();
        while (group != null) {
            if (group instanceof ContextThreadGroup) {
                return (ContextThreadGroup)group;
            }
            group = group.getParent();
        }
        // awt.59=Application has run out of context thread group
        throw new RuntimeException(Messages.getString("awt.59")); //$NON-NLS-1$
    }
    
    public static boolean shutdownPending() {
        return getCurrentContext().shutdownPending;
    }

    void shutdown() {
        if (!multiContextMode) {
            return;
        }
        shutdownPending = true;

        //???AWT: componentInternals.shutdown();

        synchronized(contextLock) {
            toolkit = null;
            componentInternals = null;
            //???AWT: dtk = null;
            wtk = null;
            graphicsEnvironment = null;
        }
    }
    
}