package es.upm.fi.dia.oeg.map4rdf.client.widget; import java.util.ArrayList; import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JsArray; import com.google.gwt.dom.client.Style.TextAlign; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.maps.client.services.DirectionsLeg; import com.google.gwt.maps.client.services.DirectionsRoute; import com.google.gwt.maps.client.services.DirectionsStep; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.InlineHTML; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Widget; import es.upm.fi.dia.oeg.map4rdf.client.resource.BrowserMessages; import es.upm.fi.dia.oeg.map4rdf.client.util.DrawPointStyle; import es.upm.fi.dia.oeg.map4rdf.client.util.GeoResourceGeometry; import es.upm.fi.dia.oeg.map4rdf.client.util.LocaleUtil; import es.upm.fi.dia.oeg.map4rdf.client.util.RouteSelectedCallback; import es.upm.fi.dia.oeg.map4rdf.share.GeoResource; import es.upm.fi.dia.oeg.map4rdf.share.Geometry; public class RoutesDescriptionWidget extends Composite{ private JsArray<DirectionsRoute> routes; private ArrayList<Panel> routePanels; private BrowserMessages browserMessages; private List<GeoResourceGeometry> geoResources; private RouteSelectedCallback callback; private ScrollPanel scrollPanel; private FlowPanel routesSelect; private FlowPanel routesNumbers; private ArrayList<Widget> allRoutesNumbers; private Widget lastNumberChange; public RoutesDescriptionWidget(JsArray<DirectionsRoute> routes,List<GeoResourceGeometry> geoResources,RouteSelectedCallback callback,BrowserMessages browserMessages){ this.routes=routes; this.geoResources=geoResources; this.browserMessages=browserMessages; this.callback=callback; this.routePanels=new ArrayList<Panel>(); this.allRoutesNumbers=new ArrayList<Widget>(); initWidget(createUi()); } private Widget createUi() { AbsolutePanel panel=new AbsolutePanel(); scrollPanel=new ScrollPanel(); scrollPanel.setSize("100%", "90%"); initializeRouteSelect(); panel.add(routesSelect); panel.add(scrollPanel); for(int i=0;i<routes.length();i++){ addRouteSelect(i+1); FlowPanel flowPanel= new FlowPanel(); flowPanel.setSize("100%", "90%"); DirectionsRoute directionsRoute= routes.get(i); if(directionsRoute.getWarnings().length()!=0){ flowPanel.add(new Label(browserMessages.warning())); for(int warn=0;warn<directionsRoute.getWarnings().length();warn++){ flowPanel.add(new InlineHTML(directionsRoute.getWarnings().get(warn))); } } for(int leg=0;leg<directionsRoute.getLegs().length();leg++){ int waypoint=leg; if(leg>0 && leg <directionsRoute.getLegs().length()){ waypoint=directionsRoute.getWayPoint_Order().get(leg-1); waypoint++; } addPoint(flowPanel, waypoint); DirectionsLeg directionLeg = directionsRoute.getLegs().get(leg); flowPanel.add(new Label(browserMessages.distance())); flowPanel.add(new InlineHTML(directionLeg.getDistance().getText())); flowPanel.add(new Label(browserMessages.estimatedTime())); flowPanel.add(new InlineHTML(directionLeg.getDuration().getText())); flowPanel.add(new InlineHTML("<br>")); for(int step=0;step<directionLeg.getSteps().length();step++){ DirectionsStep directionsStep = directionLeg.getSteps().get(step); flowPanel.add(new InlineHTML("<br>")); flowPanel.add(new InlineHTML(directionsStep.getInstructions())); flowPanel.add(new InlineHTML("<br>")); } } addPoint(flowPanel, directionsRoute.getLegs().length()); flowPanel.add(new InlineHTML("<br>")); flowPanel.add(new InlineHTML("<br>")); flowPanel.add(new Label(browserMessages.copyrights())); flowPanel.add(new InlineHTML(directionsRoute.getCopyrights())); routePanels.add(flowPanel); } scrollPanel.setWidget(routePanels.get(0)); callback.onRouteSelected(routes.get(0)); return panel; } private Widget getAnchor(GeoResource resource, Geometry geometry){ String label=LocaleUtil.getBestLabel(resource); Anchor anchor = new Anchor(label, resource.getUri()); anchor.setTarget("_blank"); return anchor; } private void addPoint(Panel panel, int point){ panel.add(new InlineHTML("<br>")); if(DrawPointStyle.getLeterSize()<=point){ point=DrawPointStyle.getLeterSize()-1; } char leter=(char)(DrawPointStyle.getMinLeter()+point); panel.add(new Image(GWT.getModuleBaseURL()+new DrawPointStyle(leter).getImageURL())); GeoResourceGeometry resource=geoResources.get(point); panel.add(getAnchor(resource.getResource(), resource.getGeometry())); } private void initializeRouteSelect(){ routesSelect=new FlowPanel(); Label label=new Label(browserMessages.nameRoute()); routesSelect.add(label); label.getElement().getStyle().setFontSize(14, Unit.PX); label.getElement().getStyle().setTextAlign(TextAlign.CENTER); label.getElement().getStyle().setColor("blue"); routesNumbers=new FlowPanel(); routesNumbers.getElement().getStyle().setTextAlign(TextAlign.CENTER); routesSelect.add(routesNumbers); } private void addRouteSelect(final int number){ Anchor anchor=new Anchor(number+""); allRoutesNumbers.add(anchor); if(number!=1){ anchor.getElement().getStyle().setMarginLeft(15, Unit.PX); }else{ anchor.getElement().getStyle().setColor("red"); lastNumberChange=anchor; } anchor.getElement().getStyle().setFontSize(12, Unit.PX); anchor.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { lastNumberChange.getElement().getStyle().setColor("blue"); lastNumberChange=allRoutesNumbers.get(number-1); lastNumberChange.getElement().getStyle().setColor("red"); scrollPanel.setWidget(routePanels.get(number-1)); callback.onRouteSelected(routes.get(number-1)); } }); routesNumbers.add(anchor); } }