World Wind Java Fenggui
From World Wind Wiki
(Difference between revisions)
Revision as of 08:35, 11 January 2018 (edit) Monday (Talk | contribs) ← Previous diff |
Current revision (21:14, 21 August 2019) (edit) (undo) F0urtyfive (Talk | contribs) m (Reverted edits by Monday (Talk); changed back to last version by 76.21.41.59) |
||
Line 1: | Line 1: | ||
- | hll20180112 | + | [[Category:Java]] |
- | http://www.outletmichaelkorsonline.us.com | + | [[Category:WWJ Dev Documentation]] |
- | http://www.coach-outletonlines.us.com | + | |
- | http://www.mulberry-bags.me.uk | + | == FengGUI Layer in WorldWind == |
- | http://www.ralphlaurensale-clearance.me.uk | + | |
- | http://www.adidasnmdr1.us.com | + | 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. |
- | http://www.ultraboost.us | + | |
- | http://wwwcanadagoose-uk.com.co | + | Screenshot: |
- | http://www.longchampoutletus.us.com | + | |
- | http://www.philippplein-outlet.com | + | [[Image:fenggui_worldwind.jpg]] |
- | http://www.polooutlets.us.org | + | |
- | http://www.katespadeonlineoutlet.us.com | + | Sample code using the layer: |
- | http://www.canadagoosesalejackets.us.com | + | |
- | http://www.hermes.us.org | + | <pre> |
- | http://www.ralphlaurensale-clearance.org.uk | + | GUIBuilder builder = new FengGUILayer.GUIBuilder() { |
- | http://www.burberry-outlet-canada.ca | + | public void buildGUI(Display display) |
- | http://www.cheapoakleysunglassesofficial.us.com | + | { |
- | http://www.cheapraybans.com.co | + | Window w = new Window(false, false, false); |
- | http://www.air-max2018.us.com | + | w.setTitle("Layers"); |
- | http://www.red-bottoms.us.com | + | |
- | http://www.pandorajewelrypandora.us.com | + | w.setXY(50, 50); |
- | http://www.yeezyboost-350.us.com | + | |
- | http://www.canadagoosejacketscanada.ca | + | w.getContentContainer().setLayoutManager(new RowLayout(false)); |
- | http://www.uggbootsonline.us | + | |
- | http://www.canadagoosesaleoutlet.us.com | + | for (final Layer layer : wwd.getModel().getLayers()) |
- | http://www.uggbootswomen.us.com | + | { |
- | http://wwwcanadagoose-jacketsuk.com.co | + | if (!layer.getName().equals("Renderable")) |
- | http://www.polooutlet.in.net | + | { |
- | http://www.canadagooseoutletus.us.com | + | CheckBox fcb = new CheckBox(layer.getName()); |
- | http://www.airmax-2018.com | + | fcb.setSelected(layer.isEnabled()); |
- | http://www.adidasyeezyboost-350.us.com | + | fcb.addSelectionChangedListener(new ISelectionChangedListener() { |
- | http://www.hermes-handbags.us | + | public void selectionChanged( |
- | http://www.michaelkorsoutlet.us.org | + | SelectionChangedEvent evt) |
- | http://www.cheapnfljerseysnflwholesale.us.com | + | { |
- | http://www.uggsboots.name | + | layer.setEnabled(evt.isSelected()); |
- | http://www.adidas-yeezyshoes.us.com | + | wwd.redraw(); |
- | http://www.ralphlauren-outlet.me.uk | + | } |
- | http://www.ralphlauren.me.uk | + | }); |
- | http://www.pandora.us.com | + | w.getContentContainer().addWidget(fcb); |
- | http://www.michaelkorsfactoryoutletsale.us.com | + | } |
- | http://www.pandora-charms.us.org | + | } |
- | http://www.uggsoutletonlines.us.com | + | |
- | http://www.timberland-outlets.us | + | w.pack(); |
- | http://www.cheapnfljerseysofficial.us.com | + | display.addWidget(w); |
- | http://www.harden-vol1.com | + | display.layout(); |
- | http://www.uggoutletstore.name | + | } |
- | http://www.toryburchoutletonline.com.co | + | }; |
- | http://www.polo-ralphlauren.in.net | + | </pre> |
- | http://www.canadagooseoutlet.name | + | |
- | http://www.ralphlaurenoutlet.in.net | + | FengGUILayer: |
- | http://www.michael-korsoutlet.ca | + | |
- | http://www.uggoutletonline.name | + | <pre> |
- | http://www.cheapjordans.in.net | + | import gov.nasa.worldwind.WorldWindow; |
- | http://www.nikeoutlet.us.com | + | import gov.nasa.worldwind.event.InputHandler; |
- | http://www.nikeairmax.in.net | + | import gov.nasa.worldwind.render.DrawContext; |
- | http://www.uggs-boots.us.org | + | import gov.nasa.worldwind.render.OrderedRenderable; |
- | http://www.yeezyboost.org.uk | + | |
- | http://www.nike-store.us.com | + | import java.awt.Point; |
- | http://www.uggsaustralia.fr | + | import java.awt.event.KeyEvent; |
- | http://www.uggsoutlet.cc | + | import java.awt.event.KeyListener; |
- | http://www.coachfactoryoutlet-storeonline.us.com | + | import java.awt.event.MouseEvent; |
- | http://www.moncler-outlet.us.org | + | import java.awt.event.MouseListener; |
- | http://www.air-jordans.us.com | + | import java.awt.event.MouseMotionListener; |
- | http://www.pandoracharms.us.com | + | import java.awt.event.MouseWheelEvent; |
- | http://www.oakley.nom.co | + | import java.awt.event.MouseWheelListener; |
- | http://www.coachhandbagsoutlet.us.com | + | |
- | http://www.moncleroutlets.us.org | + | import javax.media.opengl.GLAutoDrawable; |
- | http://www.uggscanadaugg.ca | + | import javax.media.opengl.GLCanvas; |
- | http://www.christianlouboutinoutlet.us | + | import javax.media.opengl.GLEventListener; |
- | http://www.outletlouisvuitton.us.com | + | |
- | http://www.jordanretro.name | + | import org.fenggui.Display; |
- | http://www.guccihandbagsoutlet.us.com | + | import org.fenggui.FengGUI; |
- | http://www.oakleysunglassesforwomen.us.com | + | import org.fenggui.render.jogl.EventHelper; |
- | http://www.michael-korshandbags.me.uk | + | |
- | http://www.outletuggoutlet.us.com | + | public class FengGUILayer implements GLEventListener, OrderedRenderable |
- | http://www.uggs-boots.fr | + | { |
- | http://www.salvatoreferragamoshoes.us.com | + | // the canvas on which the OpenGL will draw his stuff. We keep |
- | http://www.katespadeoutletstoreonline.us.com | + | // it as a field because we need the canvas to instantiate the |
- | http://www.canadagoosejacketssale.com.co | + | // JOGL binding. |
- | http://www.canadagooseukjackets.me.uk | + | private GLCanvas canvas = null; |
- | http://www.nikezoom.us | + | |
- | http://www.airmax-97.us | + | // The root of the Widget tree. |
- | http://www.uggoutlet-store.us | + | private Display display = null; |
- | http://www.canadagooseoutlet-jackets.us | + | |
- | http://www.timberlandbootsoutlets.us.com | + | private WorldWindow wwd; |
- | http://www.coachoutlet-onlinesale.us.com | + | |
- | http://www.raybansunglasses.net.co | + | private OrderedRenderable orderedImage = new OrderedRenderable() |
- | http://www.ralph-laurenoutlet.com.co | + | { |
- | http://www.pandoracharmssaleclearance.uk | + | // Set distance to -1 so FengGUI windows will appear in front |
- | http://www.canadagooseoutletjackets.com.co | + | // of the WorldWind compass |
- | http://www.mbtshoessale.us.com | + | public double getDistanceFromEye() |
- | http://www.coachoutletstoreonline.com.co | + | { |
- | http://www.adidasnmd-shoes.us | + | return -1; |
- | http://www.kate-spade.us.com | + | } |
- | http://www.louisvuittonoutlet.us.org | + | |
- | http://www.michaelkorsoutletclearance.in.net | + | public void pick(DrawContext dc, Point pickPoint) |
- | http://www.adidasshoe.us.com | + | { |
- | http://www.canadagooseoutletjackets.us | + | // Not implemented |
- | http://www.michaelkorsoutletonlinemichaelkors.us.com | + | } |
- | http://www.uggsoutletclearance.us.com | + | |
- | http://www.canadagoose-outlet.name | + | public void render(DrawContext dc) |
- | http://www.canadagoosejacketsoutlet.name | + | { |
- | http://www.ralphlaurenoutletonline-polo.us.com | + | FengGUILayer.this.display.display(); |
- | http://www.adidas-nmd.us.com | + | } |
- | http://www.adidasnmd.us.org | + | }; |
- | http://www.katespade.in.net | + | |
- | http://www.louboutinshoes.in.net | + | private GUIBuilder builder; |
- | http://www.monclerjacketsoutlet.in.net | + | |
- | http://www.uggsoutletstoreonline.us.com | + | public FengGUILayer(WorldWindow wwd, GUIBuilder builder) |
- | http://www.hermesbirkin.in.net | + | { |
- | http://www.adidas-shoes.us.com | + | this.wwd = wwd; |
- | http://www.poloralphlaurenoutletonline.us.com | + | this.canvas = (GLCanvas) wwd; |
- | http://www.michaelkors-outlet.ca | + | this.builder = builder; |
- | http://www.coachfactory-outletonline.us.org | + | |
- | http://www.nikeoutlet.in.net | + | canvas.addGLEventListener(this); |
- | http://www.uggsbootsonline.us.com | + | } |
- | http://www.cheapmlbjerseyschina.us.com | + | |
- | http://www.oakleysunglassessalecheap.us.com | + | private void buildGUI() |
- | http://www.katespadehandbagsclearance.us.com | + | { |
- | http://www.nikeshoes.in.net | + | display = FengGUI.createDisplay(new MyJOGLBinding(canvas)); |
- | http://www.fitflopssale-clearance.us.org | + | display.setDepthTestEnabled(true); |
- | http://www.longchamp-outlet.us.com | + | |
- | http://www.pandoracharms.name | + | new EventBinding(wwd.getInputHandler()); |
- | http://www.outletcanadagoose.us | + | |
- | http://www.airmax-97.us.com | + | builder.buildGUI(display); |
- | http://www.raybansunglassessalecheap.us.com | + | } |
- | http://www.uggbootssales.us.com | + | |
- | http://www.cheapoakleysunglasses.com.co | + | public void display(GLAutoDrawable arg0) |
- | http://www.coachoutlet-online.us.org | + | { |
- | http://www.michaelkorsoutletshopping.us.com | + | // Display is done in the render method |
- | http://www.ralphlaurenoutletpolo.org.uk | + | } |
- | http://www.canadiangoose.us.com | + | |
- | http://www.pandora-outlet.us.com | + | public void render(DrawContext dc) |
- | http://www.jordanshoesforsale.us.com | + | { |
- | http://www.michaelkorsoutlet1.us.com | + | dc.addOrderedRenderable(this.orderedImage); |
- | http://www.ralph-laurenoutlet.org.uk | + | } |
- | http://www.ralph-laurenuk.org.uk | + | |
- | http://www.coach-outletonline.us.org | + | public void reshape(GLAutoDrawable drawable, int x, int y, int width, |
- | http://www.timberlandbootsoutlet.us.com | + | int height) |
- | http://www.raybansunglasse.com | + | { |
- | http://www.adidas-superstar.us.com | + | // does nothing |
- | http://www.northface-jackets.us.com | + | } |
- | http://www.coachoutletcanada.ca | + | |
- | http://www.canadagooseukjackets.org.uk | + | /** |
- | http://www.michael-korsoutlets.us.com | + | * JOGL callback method |
- | http://www.ralphlaurenoutletsale.us.com | + | */ |
- | http://www.nikeshoes.us.com | + | public void displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) |
- | http://www.supremeclothing.us.org | + | { |
- | http://www.thenorthfacejacketsoutlet.us.com | + | // does nothing |
- | http://www.monclerjacketsuk.org.uk | + | } |
- | http://www.uggoutletonlines.us | + | |
- | http://www.doudounemonclerpascher.fr | + | /** |
- | http://www.coachoutletus.us.com | + | * JOGL callback method |
- | http://www.outletcoachoutlet.us.com | + | */ |
- | http://www.ugg-boots.net.co | + | public void init(GLAutoDrawable drawable) |
- | http://www.airjordanshoes.in.net | + | { |
- | http://www.cheapjordans-shoes.us.com | + | buildGUI(); |
- | http://www.cheapjordanshoes.us.com | + | } |
- | http://www.raybanssunglassesoutlet.us.com | + | |
- | http://www.moncleroutlet.me.uk | + | public double getDistanceFromEye() |
- | http://www.michaelkorsoutlet.co.uk | + | { |
- | http://www.uggbootsoutletstores.us.com | + | // TODO Auto-generated method stub |
- | http://www.oakley--sunglasses.us.org | + | return 0; |
- | http://www.louisvuitton-outlet.us.com | + | } |
- | http://www.cheapjordan-shoes.in.net | + | |
- | http://www.uggsoutletus.us.com | + | public void pick(DrawContext dc, Point pickPoint) |
- | http://www.adadassuperstar.com | + | { |
- | http://www.cheapjordans.com.co | + | // TODO Auto-generated method stub |
- | http://www.catboots.us | + | |
- | http://www.ralphlaurenoutletmalls.us.com | + | } |
- | http://www.vuittonlouis.us.com | + | |
- | http://www.cheapuggs.com.co | + | private class EventBinding implements KeyListener, MouseMotionListener, |
- | http://www.burberryoutlet.in.net | + | MouseListener, MouseWheelListener |
- | http://www.christianlouboutinshoes.us.org | + | { |
- | http://www.michaelkorsoutletonlineclearance.in.net | + | private boolean mouseDragging = false; |
- | http://www.outletcoachonline.us.com | + | private boolean mousePressed = false; |
- | http://ugg.bootsoutlet.us.com | + | private boolean mouseReleased = false; |
- | http://www.valentinoshoesoutlets.us.com | + | |
- | http://www.pandoracharmssale-clearance.us.com | + | /** |
- | http://www.fitflopssale.us.com | + | * Creates a new Binding. |
- | http://www.nfljerseyscheapwholesale.us.com | + | * @param c the JOGLUI canvas |
- | http://www.coach-factory-outlet.us.org | + | * @param d the FengGUI Display |
- | http://www.yeezyboost.us.com | + | */ |
- | http://www.thenorthface.us.com | + | public EventBinding(InputHandler handler) |
- | http://www.2017nikeairmax.us | + | { |
- | http://www.monclerjacketssale.us.com | + | // makes FengGUI listen to tab keys |
- | http://www.supremenewyork.us.com | + | // http://answers.google.com/answers/threadview?id=126916 |
- | http://www.coachfactoryonlineoutlet.com.co | + | canvas.setFocusTraversalKeysEnabled(false); |
- | http://www.coach-factoryoutletonline.us.org | + | |
- | http://www.pandorastore.us.com | + | handler.addMouseListener(this); |
- | http://www.ralphlauren-outletpolo.us.com | + | handler.addMouseMotionListener(this); |
- | http://www.coachoutletonlinecoachfactoryoutlet.us.com | + | handler.addMouseWheelListener(this); |
- | http://www.coach-factoryoutlet-online.us.com | + | canvas.addKeyListener(this); |
- | http://www.ugg-outlets.us | + | } |
- | http://www.canadagoosejacketscoats.org.uk | + | |
- | http://www.fredperrypoloshirts.us | + | /** |
- | http://www.adidascampusshoes.us | + | * Forwards the key typed event to the Display. |
- | http://www.coachoutletmalls.us.com | + | * @param e the event |
- | http://www.canadagoosejackets-outlet.us | + | */ |
- | http://wwwmonclerjacketsuk.com.co | + | public void keyTyped(KeyEvent e) |
- | http://www.ugg-outletstores.us.com | + | { |
- | http://www.ferragamo-outlet.us.com | + | if (display.fireKeyTypedEvent(e.getKeyChar())) |
- | http://www.adidas.us.com | + | { |
- | http://www.redbottomsshoes.us.com | + | e.consume(); |
- | http://www.burberry.us.com | + | } |
- | http://www.canadagoosejacketsofficial.us.com | + | } |
- | http://www.korsmichaeloutlet.us.com | + | |
- | http://www.coachoutletsonlines.us.com | + | /** |
- | http://www.michael-kors-handbags.us.org | + | * Forwards the key pressed event to the Display. |
- | http://www.airjordans.us.com | + | * @param e the event |
- | http://www.canadagooseoutletjackets.us.com | + | */ |
- | http://www.supreme-clothing.us.com | + | public void keyPressed(KeyEvent e) |
- | http://www.uggsbootscanada.ca | + | { |
- | http://www.pandora-jewelryoutlet.us.com | + | if (display.fireKeyPressedEvent(e.getKeyChar(), EventHelper |
- | http://www.longchamphandbagsuk.org.uk | + | .getKeyPressed(e))) |
- | http://www.coachfactory-outletstore.us.com | + | { |
- | http://www.poloralphlaurenoutletpolo.us.com | + | e.consume(); |
- | http://www.uggoutlet-clearance.us.com | + | } |
- | http://www.uggbootsoutletsale.us.com | + | } |
- | http://www.northfacejacketssale.us.com | + | |
- | http://www.canadagooseoutletcanada.com.co | + | /** |
- | http://www.columbiasportswear.us.com | + | * Forwards the key released event to the Display. |
- | http://www.canadagoosesoutlet.ca | + | * @param e the event |
- | http://www.canadagooseoutletjackets.ca | + | */ |
- | http://www.coachoutletstoreonlineclearances.in.net | + | public void keyReleased(KeyEvent e) |
- | http://www.burberryoutletsale.com.co | + | { |
- | http://www.cheapuggssale.com.co | + | if (display.fireKeyReleasedEvent(e.getKeyChar(), EventHelper |
- | http://www.mulberryoutlet.org.uk | + | .getKeyPressed(e))) |
- | http://www.coach-outlets.us.com | + | { |
- | http://www.hermesbag.us.com | + | e.consume(); |
- | http://www.yeezyboost-350.co.uk | + | } |
- | http://www.northfaceoutlet.us.com | + | } |
- | http://www.supremeclothing.org.uk | + | |
- | http://www.uggsoutlets.name | + | /** |
- | http://www.adidas-yeezyboost.us.com | + | * Forwards the mouse dragged event to the Display. |
- | http://www.coachfactory-outlet.us.com | + | * @param e the event |
- | http://www.canadagooseoutlets.us | + | */ |
- | http://www.adidas-outlet.us.com | + | public void mouseDragged(MouseEvent e) |
- | http://www.canadagooseclothing.us.com | + | { |
- | http://www.michaelkorsoutlets.us.com | + | if (display.fireMouseDraggedEvent(e.getX(), display.getHeight() |
- | http://www.rayban-sunglasseoutlet.us.com | + | - e.getY(), EventHelper.getMouseButton(e))) |
- | http://www.northfacejacketsoutlet.com.co | + | { |
- | http://www.birkenstocks.us | + | mouseDragging = true; |
- | http://www.philipppleinshirt.com | + | } |
- | http://www.jacketscanadagoose.org.uk | + | if (mouseDragging) |
- | http://www.fitflops-sale-clearance.us.com | + | { |
- | http://www.cheapuggs.net.co | + | e.consume(); |
- | http://www.adidasoutlet.us.com | + | } |
- | http://www.canadagooseoutletonlines.us | + | } |
- | http://www.uggsbootsaustralia.us.com | + | |
- | http://www.coachfactoryoutletsonlines.us.com | + | /** |
- | http://www.coachoutlets.us.org | + | * Forwards the mouse moved event to the Display. |
- | http://www.cheapuggboots.us.com | + | * @param e the event |
- | http://www.michael-korsoutlet.us.com | + | */ |
- | http://www.moncler-outlets.us.com | + | public void mouseMoved(MouseEvent e) |
- | http://www.pandoracharms-uk.org.uk | + | { |
- | http://www.pandoracharms.com.co | + | if (display.fireMouseMovedEvent(e.getX(), display.getHeight() |
- | http://www.uggs-boots.us | + | - e.getY())) |
- | http://www.adidasyeezyshoes.us.com | + | { |
- | http://www.canadagooseoutletstores.us | + | e.consume(); |
- | http://www.nikeoutletonline.us.com | + | } |
- | http://www.uggshoes.us.com | + | } |
- | http://www.coachcanadaoutlet.ca | + | |
- | http://www.mbtshoes.name | + | /** |
- | http://www.pandorajewelryoutlet.in.net | + | * Does nothing. |
- | http://www.cheapuggs-boots.us.com | + | * @param arg0 the event |
- | http://www.outletcanadagooseoutlet.us.com | + | */ |
- | http://www.moncleroutletonlines.us.com | + | public void mouseClicked(MouseEvent e) |
- | http://www.guccioutlets.us.org | + | { |
- | http://www.uggoutlets.name | + | if (mousePressed && mouseReleased) |
- | hll20180112 | + | { |
+ | 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); | ||
+ | } | ||
+ | } | ||
+ | </pre> |
Current revision
[edit] 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); } }