package edu.ucdavis.cstars.client.control; import java.util.LinkedList; import java.util.List; import com.google.gwt.dom.client.Style.Overflow; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.ui.AbsolutePanel; import edu.ucdavis.cstars.client.MapWidget; import edu.ucdavis.cstars.client.event.MapResizeHandler; import edu.ucdavis.cstars.client.geometry.Extent; /** * Handles all control events and Objects. Used by the MapWidget * * @author Justin Merz */ public class ControlHandler { private List<Control> controls = new LinkedList<Control>(); private MapWidget map; private AbsolutePanel controlLayer; /** * Pass references to the control layer and map * * @param m - map * @param cl - control layer */ public ControlHandler(MapWidget m, AbsolutePanel cl){ this.map = m; this.controlLayer = cl; controlLayer.getElement().getStyle().setPosition(com.google.gwt.dom.client.Style.Position.ABSOLUTE); controlLayer.getElement().getStyle().setOverflow(Overflow.VISIBLE); controlLayer.getElement().getStyle().setTop(0, Unit.PX); controlLayer.getElement().getStyle().setLeft(0, Unit.PX); controlLayer.setStyleName("controlLayer"); map.addResizeHandler(new MapResizeHandler(){ @Override public void onMapResize(Extent extent, int width, int height) { moveControls(); } }); } /** * Remove control to handler * * @param c - control to remove */ public void removeControl(Control c){ if( !controls.contains(c) ) return; controls.remove(c); controlLayer.remove(c); } /** * Add control to handler * * @param c */ public void addControl(Control c) { c.getElement().getStyle().setPosition(com.google.gwt.dom.client.Style.Position.RELATIVE); controls.add(c); controlLayer.add(c); setPosition(c); c.init(map); c.setControlHandler(this); } public void updateControlPosition(Control c){ if( controls.contains(c) ) setPosition(c); } /** * reposition all controls */ private void moveControls() { for( Control c: controls ){ setPosition(c); } } /** * reposition control based on its anchor * * @param c - control to add */ private void setPosition(Control c) { if( !c.isVisible() ) return; if( c.getPosition() == Position.TOP_LEFT ){ controlLayer.setWidgetPosition(c, c.getLeft(), c.getTop()); } else if ( c.getPosition() == Position.TOP_CENTER ) { setTopCenter(c); } else if ( c.getPosition() == Position.TOP_RIGHT ) { setUpperRight(c); } else if( c.getPosition() == Position.BOTTOM_LEFT ){ setLowerLeft(c); } else if ( c.getPosition() == Position.BOTTOM_RIGHT ){ setLowerRight(c); } } private void setTopCenter(Control c){ int left = (map.getMapPanel().getOffsetWidth()/2) - (c.getOffsetWidth()/2); controlLayer.setWidgetPosition(c, left, c.getTop()); } private void setUpperRight(Control c){ int left = map.getMapPanel().getOffsetWidth() - c.getLeft() - c.getOffsetWidth(); controlLayer.setWidgetPosition(c, left, c.getTop()); } private void setLowerLeft(Control c){ int top = map.getMapPanel().getOffsetHeight() - c.getOffsetHeight() - c.getTop(); controlLayer.setWidgetPosition(c, c.getLeft(), top); } private void setLowerRight(Control c){ int top = map.getMapPanel().getOffsetHeight() - c.getOffsetHeight() - c.getTop(); int left = map.getMapPanel().getOffsetWidth() - c.getOffsetWidth() - c.getLeft(); controlLayer.setWidgetPosition(c, left, top); } }