package javaforce.gl;
import javaforce.jni.JFNative;
/** OpenGL Window.
*
* @author pquiring
*/
public class GLWindow {
static {
GL.load();
}
public static final int MOUSE_BUTTON_LEFT = 1;
public static final int MOUSE_BUTTON_RIGHT = 2;
public static final int MOUSE_BUTTON_MIDDLE = 3;
public static interface KeyEvents {
public void keyTyped(char ch);
public void keyPressed(int key);
public void keyReleased(int key);
}
public static interface MouseEvents {
public void mouseMove(int x,int y);
public void mouseDown(int button);
public void mouseUp(int button);
public void mouseScroll(int x,int y);
}
public static interface WindowEvents {
public void windowResize(int x,int y);
public void windowClosing();
}
private static native boolean ninit();
public static boolean init() {
if (!JFNative.loaded) return false;
return ninit();
}
private long id;
private KeyEvents keys;
private MouseEvents mouse;
private WindowEvents window;
private static final int KEY_TYPED = 1;
private static final int KEY_PRESS = 2;
private static final int KEY_RELEASE = 3;
private static final int MOUSE_MOVE = 4;
private static final int MOUSE_DOWN = 5;
private static final int MOUSE_UP = 6;
private static final int MOUSE_SCROLL = 7;
private static final int WIN_RESIZE = 8;
private static final int WIN_CLOSING = 9;
/** This is called from native code to dispatch events. */
private void dispatchEvent(int type, int v1, int v2) {
switch (type) {
case KEY_TYPED: if (keys != null) keys.keyTyped((char)v1); break;
case KEY_PRESS: if (keys != null) keys.keyPressed((char)v1); break;
case KEY_RELEASE: if (keys != null) keys.keyReleased((char)v1); break;
case MOUSE_MOVE: if (mouse != null) mouse.mouseMove(v1, v2); break;
case MOUSE_DOWN: if (mouse != null) mouse.mouseDown(v1); break;
case MOUSE_UP: if (mouse != null) mouse.mouseUp(v1); break;
case MOUSE_SCROLL: if (mouse != null) mouse.mouseScroll(v1, v2); break;
case WIN_RESIZE: if (window != null) window.windowResize(v1, v2); break;
case WIN_CLOSING: if (window != null) window.windowClosing(); break;
}
}
public static final int STYLE_VISIBLE = 1;
public static final int STYLE_RESIZABLE = 2;
public static final int STYLE_TITLEBAR = 4;
public static final int STYLE_FULLSCREEN = 8;
private static native long ncreate(int style, String title, int width, int height, GLWindow eventMgr, long shared);
public boolean create(int style, String title, int width, int height, GLWindow shared) {
id = ncreate(style, title, width, height, this, shared == null ? 0 : shared.id);
return id != 0;
}
private static native void ndestroy(long id);
/** Show the window. */
public void destroy() {
if (id == 0) return;
ndestroy(id);
id = 0;
}
private static native void nsetcurrent(long id);
/** Set the OpenGL Context current for this window. */
public void setCurrent() {
nsetcurrent(id);
}
private static native void nseticon(long id, String icon, int x, int y);
/** Set an icon to the window.
* This function is somewhat platform dependant.
* Only windows is supported currently.
* @param filename = file (.ico for windows)
*/
public void setIcon(String filename, int x, int y) {
nseticon(id, filename, x, y);
}
public void setKeyListener(KeyEvents keys) {
this.keys = keys;
}
public void setMouseListener(MouseEvents mouse) {
this.mouse = mouse;
}
public void setWindowListener(WindowEvents window) {
this.window = window;
}
/** Polls for events. */
public static native void pollEvents();
private static native void nshow(long id);
/** Show the window. */
public void show() {
nshow(id);
}
private static native void nhide(long id);
/** Hide the window. */
public void hide() {
nhide(id);
}
private static native void nswap(long id);
/** Swaps the OpenGL Buffers. */
public void swap() {
nswap(id);
}
private static native void nhidecursor(long id);
/** Hide the cursor. */
public void hideCursor() {
nhidecursor(id);
}
private static native void nshowcursor(long id);
/** Show the cursor (default). */
public void showCursor() {
nshowcursor(id);
}
private static native void nlockcursor(long id);
/** Hide the cursor and lock to this window.
* Use showCursor() to unlock.
*/
public void lockCursor() {
nlockcursor(id);
}
private static native void ngetpos(long id, int pos[]);
/** Get window position.
* @return int[0] = x, int[1] = y
*/
public int[] getPosition() {
int ret[] = new int[2];
ngetpos(id, ret);
return ret;
}
private static native void nsetpos(long id, int x, int y);
/** set window position.
* @return int[0] = x, int[1] = y
*/
public void setPosition(int x,int y) {
nsetpos(id, x, y);
}
}