1package com.jme3.system.awt;
2
3import com.jme3.input.JoyInput;
4import com.jme3.input.KeyInput;
5import com.jme3.input.MouseInput;
6import com.jme3.input.TouchInput;
7import com.jme3.input.awt.AwtKeyInput;
8import com.jme3.input.awt.AwtMouseInput;
9import com.jme3.renderer.Renderer;
10import com.jme3.system.*;
11import java.util.ArrayList;
12
13public class AwtPanelsContext implements JmeContext {
14
15    protected JmeContext actualContext;
16    protected AppSettings settings = new AppSettings(true);
17    protected SystemListener listener;
18    protected ArrayList<AwtPanel> panels = new ArrayList<AwtPanel>();
19    protected AwtPanel inputSource;
20
21    protected AwtMouseInput mouseInput = new AwtMouseInput();
22    protected AwtKeyInput keyInput = new AwtKeyInput();
23
24    protected boolean lastThrottleState = false;
25
26    private class AwtPanelsListener implements SystemListener {
27
28        public void initialize() {
29            initInThread();
30        }
31
32        public void reshape(int width, int height) {
33            throw new IllegalStateException();
34        }
35
36        public void update() {
37            updateInThread();
38        }
39
40        public void requestClose(boolean esc) {
41            // shouldn't happen
42            throw new IllegalStateException();
43        }
44
45        public void gainFocus() {
46            // shouldn't happen
47            throw new IllegalStateException();
48        }
49
50        public void loseFocus() {
51            // shouldn't happen
52            throw new IllegalStateException();
53        }
54
55        public void handleError(String errorMsg, Throwable t) {
56            listener.handleError(errorMsg, t);
57        }
58
59        public void destroy() {
60            destroyInThread();
61        }
62    }
63
64    public void setInputSource(AwtPanel panel){
65        if (!panels.contains(panel))
66            throw new IllegalArgumentException();
67
68        inputSource = panel;
69        mouseInput.setInputSource(panel);
70        keyInput.setInputSource(panel);
71    }
72
73    public Type getType() {
74        return Type.OffscreenSurface;
75    }
76
77    public void setSystemListener(SystemListener listener) {
78        this.listener = listener;
79    }
80
81    public AppSettings getSettings() {
82        return settings;
83    }
84
85    public Renderer getRenderer() {
86        return actualContext.getRenderer();
87    }
88
89    public MouseInput getMouseInput() {
90        return mouseInput;
91    }
92
93    public KeyInput getKeyInput() {
94        return keyInput;
95    }
96
97    public JoyInput getJoyInput() {
98        return null;
99    }
100
101    public TouchInput getTouchInput() {
102        return null;
103    }
104
105    public Timer getTimer() {
106        return actualContext.getTimer();
107    }
108
109    public boolean isCreated() {
110        return actualContext != null && actualContext.isCreated();
111    }
112
113    public boolean isRenderable() {
114        return actualContext != null && actualContext.isRenderable();
115    }
116
117    public AwtPanelsContext(){
118    }
119
120    public AwtPanel createPanel(PaintMode paintMode){
121        AwtPanel panel = new AwtPanel(paintMode);
122        panels.add(panel);
123        return panel;
124    }
125
126    private void initInThread(){
127        listener.initialize();
128    }
129
130    private void updateInThread(){
131        // Check if throttle required
132        boolean needThrottle = true;
133
134        for (AwtPanel panel : panels){
135            if (panel.isActiveDrawing()){
136                needThrottle = false;
137                break;
138            }
139        }
140
141        if (lastThrottleState != needThrottle){
142            lastThrottleState = needThrottle;
143            if (lastThrottleState){
144                System.out.println("OGL: Throttling update loop.");
145            }else{
146                System.out.println("OGL: Ceased throttling update loop.");
147            }
148        }
149
150        if (needThrottle){
151            try {
152                Thread.sleep(100);
153            } catch (InterruptedException ex) {
154            }
155        }
156
157        listener.update();
158    }
159
160    private void destroyInThread(){
161        listener.destroy();
162    }
163
164    public void setSettings(AppSettings settings) {
165        this.settings.copyFrom(settings);
166        this.settings.setRenderer(AppSettings.LWJGL_OPENGL2);
167        if (actualContext != null){
168            actualContext.setSettings(settings);
169        }
170    }
171
172    public void create(boolean waitFor) {
173        if (actualContext != null){
174            throw new IllegalStateException("Already created");
175        }
176
177        actualContext = JmeSystem.newContext(settings, Type.OffscreenSurface);
178        actualContext.setSystemListener(new AwtPanelsListener());
179        actualContext.create(waitFor);
180    }
181
182    public void destroy(boolean waitFor) {
183        if (actualContext == null)
184            throw new IllegalStateException("Not created");
185
186        // destroy parent context
187        actualContext.destroy(waitFor);
188    }
189
190    public void setTitle(String title) {
191        // not relevant, ignore
192    }
193
194    public void setAutoFlushFrames(boolean enabled) {
195        // not relevant, ignore
196    }
197
198    public void restart() {
199        // only relevant if changing pixel format.
200    }
201
202}
203