World Wind Java Fenggui

FengGUI Layer in WorldWind
Here is the code for a simple FengGUI layer. You should be able to use any of the FengGUI widgets within it. I included a small sample creating a layer panel using FengGUI.

Screenshot:



Sample code using the layer:

GUIBuilder builder = new FengGUILayer.GUIBuilder { public void buildGUI(Display display) {		Window w = new Window(false, false, false); w.setTitle("Layers");

w.setXY(50, 50);

w.getContentContainer.setLayoutManager(new RowLayout(false));

for (final Layer layer : wwd.getModel.getLayers) {			if (!layer.getName.equals("Renderable")) {				CheckBox fcb = new CheckBox(layer.getName); fcb.setSelected(layer.isEnabled); fcb.addSelectionChangedListener(new ISelectionChangedListener {					public void selectionChanged( SelectionChangedEvent evt)					{						layer.setEnabled(evt.isSelected);						wwd.redraw;					}				}); w.getContentContainer.addWidget(fcb); }		}

w.pack; display.addWidget(w); display.layout; } };

FengGUILayer:

import gov.nasa.worldwind.WorldWindow; import gov.nasa.worldwind.event.InputHandler; import gov.nasa.worldwind.render.DrawContext; import gov.nasa.worldwind.render.OrderedRenderable;

import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener;

import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.GLCanvas; import javax.media.opengl.GLEventListener;

import org.fenggui.Display; import org.fenggui.FengGUI; import org.fenggui.render.jogl.EventHelper;

public class FengGUILayer implements GLEventListener, OrderedRenderable {	// the canvas on which the OpenGL will draw his stuff. We keep // it as a field because we need the canvas to instantiate the // JOGL binding. private GLCanvas canvas = null;

// The root of the Widget tree. private Display display = null;

private WorldWindow wwd;

private OrderedRenderable orderedImage = new OrderedRenderable {		// Set distance to -1 so FengGUI windows will appear in front // of the WorldWind compass public double getDistanceFromEye {			return -1; }

public void pick(DrawContext dc, Point pickPoint) {			// Not implemented }

public void render(DrawContext dc) {			FengGUILayer.this.display.display; }	};

private GUIBuilder builder;

public FengGUILayer(WorldWindow wwd, GUIBuilder builder) {		this.wwd = wwd; this.canvas = (GLCanvas) wwd; this.builder = builder;

canvas.addGLEventListener(this); }

private void buildGUI {		display = FengGUI.createDisplay(new MyJOGLBinding(canvas)); display.setDepthTestEnabled(true);

new EventBinding(wwd.getInputHandler);

builder.buildGUI(display); }

public void display(GLAutoDrawable arg0) {		// Display is done in the render method }

public void render(DrawContext dc) {		dc.addOrderedRenderable(this.orderedImage); }

public void reshape(GLAutoDrawable drawable, int x, int y, int width,			int height) {		// does nothing }

/**	 * JOGL callback method */	public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {		// does nothing }

/**	 * JOGL callback method */	public void init(GLAutoDrawable drawable) {		buildGUI; }

public double getDistanceFromEye {		// TODO Auto-generated method stub return 0; }

public void pick(DrawContext dc, Point pickPoint) {		// TODO Auto-generated method stub

}

private class EventBinding implements KeyListener, MouseMotionListener, MouseListener, MouseWheelListener {		private boolean mouseDragging = false; private boolean mousePressed = false; private boolean mouseReleased = false;

/**		 * Creates a new Binding. * @param c the JOGLUI canvas * @param d the FengGUI Display */		public EventBinding(InputHandler handler) {			// makes FengGUI listen to tab keys // http://answers.google.com/answers/threadview?id=126916 canvas.setFocusTraversalKeysEnabled(false);

handler.addMouseListener(this); handler.addMouseMotionListener(this); handler.addMouseWheelListener(this); canvas.addKeyListener(this); }

/**		 * Forwards the key typed event to the Display. * @param e the event */		public void keyTyped(KeyEvent e)		{ if (display.fireKeyTypedEvent(e.getKeyChar)) {				e.consume; }		}

/**		 * Forwards the key pressed event to the Display. * @param e the event */		public void keyPressed(KeyEvent e)		{ if (display.fireKeyPressedEvent(e.getKeyChar, EventHelper .getKeyPressed(e))) {				e.consume; }		}

/**		 * Forwards the key released event to the Display. * @param e the event */		public void keyReleased(KeyEvent e)		{ if (display.fireKeyReleasedEvent(e.getKeyChar, EventHelper .getKeyPressed(e))) {				e.consume; }		}

/**		 * Forwards the mouse dragged event to the Display. * @param e the event */		public void mouseDragged(MouseEvent e)		{ if (display.fireMouseDraggedEvent(e.getX, display.getHeight - e.getY, EventHelper.getMouseButton(e))) {				mouseDragging = true; }			if (mouseDragging) {				e.consume; }		}

/**		 * Forwards the mouse moved event to the Display. * @param e the event */		public void mouseMoved(MouseEvent e)		{ if (display.fireMouseMovedEvent(e.getX, display.getHeight - e.getY)) {				e.consume; }		}

/**		 * Does nothing. * @param arg0 the event */		public void mouseClicked(MouseEvent e)		{ if (mousePressed && mouseReleased) {				e.consume; }			mousePressed = false; mouseReleased = false; }

/**		 * Forwards the mouse pressed event to the Display. * @param e the event */		public void mousePressed(MouseEvent e)		{ if (display.fireMousePressedEvent(e.getX, display.getHeight - e.getY, EventHelper.getMouseButton(e), e					.getClickCount)) {				e.consume; mousePressed = true; }		}

/**		 * Forwards the mouse released event to the Display. * @param e the event */		public void mouseReleased(MouseEvent e)		{ if (display.fireMouseReleasedEvent(e.getX, display.getHeight - e.getY, EventHelper.getMouseButton(e), e					.getClickCount)) {				e.consume; mouseReleased = true; }			mouseDragging = false; }

/**		 * Does nothing. * @param e the event */		public void mouseEntered(MouseEvent e)		{ }

/**		 * Does nothing. * @param e the event */		public void mouseExited(MouseEvent e)		{ }

/* (non-Javadoc) * @see java.awt.event.MouseWheelListener#mouseWheelMoved(java.awt.event.MouseWheelEvent) */		public void mouseWheelMoved(MouseWheelEvent e)		{ if (display.fireMouseWheel(e.getX, e.getY, e.getWheelRotation < 0, Math.abs(e.getWheelRotation))) {				e.consume; }		}	}

public interface GUIBuilder {		public void buildGUI(Display display); } }