package es.upm.fi.dia.oeg.map4rdf.client.view;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.gwtopenmaps.openlayers.client.LonLat;
import net.customware.gwt.presenter.client.EventBus;
import net.customware.gwt.dispatch.client.DispatchAsync;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.TextAlign;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.logical.shared.OpenEvent;
import com.google.gwt.event.logical.shared.OpenHandler;
import com.google.gwt.maps.client.base.LatLng;
import com.google.gwt.maps.client.services.DirectionsRequest;
import com.google.gwt.maps.client.services.DirectionsResult;
import com.google.gwt.maps.client.services.DirectionsResultHandler;
import com.google.gwt.maps.client.services.DirectionsRoute;
import com.google.gwt.maps.client.services.DirectionsService;
import com.google.gwt.maps.client.services.DirectionsStatus;
import com.google.gwt.maps.client.services.DirectionsWaypoint;
import com.google.gwt.maps.client.services.TravelMode;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DisclosurePanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
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.ListBox;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import es.upm.fi.dia.oeg.map4rdf.client.action.GetRoutePoints;
import es.upm.fi.dia.oeg.map4rdf.client.action.GetRoutePointsResult;
import es.upm.fi.dia.oeg.map4rdf.client.conf.ConfIDInterface;
import es.upm.fi.dia.oeg.map4rdf.client.event.RoutesAddPointEvent;
import es.upm.fi.dia.oeg.map4rdf.client.event.RoutesAddPointHandler;
import es.upm.fi.dia.oeg.map4rdf.client.presenter.DashboardPresenter;
import es.upm.fi.dia.oeg.map4rdf.client.presenter.GeoprocessingPresenter;
import es.upm.fi.dia.oeg.map4rdf.client.presenter.MapPresenter;
import es.upm.fi.dia.oeg.map4rdf.client.presenter.ResultsPresenter;
import es.upm.fi.dia.oeg.map4rdf.client.presenter.RoutesPresenter;
import es.upm.fi.dia.oeg.map4rdf.client.resource.BrowserMessages;
import es.upm.fi.dia.oeg.map4rdf.client.resource.BrowserResources;
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.GeoUtils;
import es.upm.fi.dia.oeg.map4rdf.client.util.LocaleUtil;
import es.upm.fi.dia.oeg.map4rdf.client.util.PanelWithGeoResourceGeometry;
import es.upm.fi.dia.oeg.map4rdf.client.util.RouteSelectedCallback;
import es.upm.fi.dia.oeg.map4rdf.client.util.RoutesAddGeoResourceType;
import es.upm.fi.dia.oeg.map4rdf.client.widget.PopupGeoprocessingView;
import es.upm.fi.dia.oeg.map4rdf.client.widget.RoutesDescriptionWidget;
import es.upm.fi.dia.oeg.map4rdf.client.widget.RoutesWidget;
import es.upm.fi.dia.oeg.map4rdf.client.widget.WidgetFactory;
import es.upm.fi.dia.oeg.map4rdf.share.GeoResource;
import es.upm.fi.dia.oeg.map4rdf.share.Geometry;
import es.upm.fi.dia.oeg.map4rdf.share.GeoprocessingType;
import es.upm.fi.dia.oeg.map4rdf.share.OpenLayersAdapter;
import es.upm.fi.dia.oeg.map4rdf.share.Point;
import es.upm.fi.dia.oeg.map4rdf.share.PointBean;
import es.upm.fi.dia.oeg.map4rdf.share.PolyLineBean;
import es.upm.fi.dia.oeg.map4rdf.share.TwoDimentionalCoordinate;
public class RoutesView extends ResizeComposite implements RoutesPresenter.Display, RoutesAddPointHandler{
private final ConfIDInterface configID;
private DispatchAsync dispatchAsync;
private EventBus eventBus;
private MapPresenter mapPresenter;
private GeoprocessingPresenter.Display geoprocessingPresenterDisplay;
private DashboardPresenter dashboardPresenter;
private ResultsPresenter resultsPresenter;
private BrowserResources browserResources;
private BrowserMessages browserMessages;
private WidgetFactory widgetFactory;
private ScrollPanel scrollPanel;
private Panel panel;
private InlineHTML addPointMessage;
private RoutesWidget routesWidget;
private Grid gridSearchTextAndAddButton;
private TextBox searchTextBox;
private Button addButton;
private TextBox searchTextBox1;
private Button addButton1;
private Button traceRoute;
private int rows;
private int lastTypeOpen=0;
private boolean[] isSearchFree;
private final int minPixelHeightOfRoutesWidget=100;
private List<GeoResourceGeometry> route;
private Map<ClickHandler,PanelWithGeoResourceGeometry> relationHandler;
private RoutesDescriptionWidget routeDescriptionWidget=null;
private MyBoolean routeAlternatives=new MyBoolean(true);
private MyBoolean avoidHighways=new MyBoolean(false);
private MyBoolean avoidTolls=new MyBoolean(false);
private MyBoolean optimizeWaypoints=new MyBoolean(true);
private Map<String,TravelMode> travelModes;
private TravelMode travelMode;
private String[] travelsModeInOrder;
private ListBox travelListBox;
private RouteSelectedCallback routeSelectedCallback;
private DisclosurePanel optionsDisPanel;
private List<Widget> disableWidgetsIfNoDriving;
@Inject
public RoutesView(ConfIDInterface configID, EventBus eventBus,MapPresenter mapPresenter,ResultsPresenter resultsPresenter, DispatchAsync dispatchAsync, BrowserResources browserResources,
BrowserMessages browserMessages, WidgetFactory widgetFactory) {
this.configID = configID;
this.dispatchAsync = dispatchAsync;
this.eventBus=eventBus;
this.mapPresenter = mapPresenter;
this.resultsPresenter = resultsPresenter;
this.browserResources=browserResources;
this.browserMessages=browserMessages;
this.widgetFactory = widgetFactory;
relationHandler=new HashMap<ClickHandler, PanelWithGeoResourceGeometry>();
route=new ArrayList<GeoResourceGeometry>();
rows=0;
isSearchFree=new boolean[]{true,true};
travelModes=new HashMap<String, TravelMode>();
disableWidgetsIfNoDriving=new ArrayList<Widget>();
initTravelModes();
initWidget(createUi());
initRouteSelectedCallback();
eventBus.addHandler(RoutesAddPointEvent.getType(),this);
}
private void initRouteSelectedCallback() {
routeSelectedCallback=new RouteSelectedCallback() {
@Override
public void onRouteSelected(DirectionsRoute route) {
drawSelectedRoute(route);
}
};
}
private Widget createUi() {
panel = new FlowPanel();
addPointMessage=new InlineHTML("<p>"+browserMessages.messageAddRoutePoint()+"</p>");
panel.add(addPointMessage);
routesWidget = new RoutesWidget("99%",minPixelHeightOfRoutesWidget+"px", browserResources);
panel.add(routesWidget);
initializeSearchTextBoxsAndAddButtons();
routesWidget.resizeRows(2);
routesWidget.setWidget(0, 0, new Image(GWT.getModuleBaseURL()+new DrawPointStyle(DrawPointStyle.getMinLeter()).getImageURL()));
routesWidget.setWidget(0, 1,searchTextBox);
routesWidget.setWidget(0, 2,addButton);
routesWidget.setWidget(1, 0, new Image(GWT.getModuleBaseURL()+new DrawPointStyle((char)(DrawPointStyle.getMinLeter()+1)).getImageURL()));
routesWidget.setWidget(1, 1,searchTextBox1);
routesWidget.setWidget(1, 2,addButton1);
gridSearchTextAndAddButton= new Grid(1, 3);
panel.add(gridSearchTextAndAddButton);
traceRoute=new Button(browserMessages.buttonTraceRoute(), new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
traceRoute();
}
});
traceRoute.getElement().getStyle().setPosition(Position.ABSOLUTE);
traceRoute.getElement().getStyle().setRight(20, Unit.PX);
Grid optionsGrid=initializeOptionsGrid();
optionsDisPanel=new DisclosurePanel(browserMessages.moreOptions());
optionsDisPanel.addOpenHandler(new OpenHandler<DisclosurePanel>() {
@Override
public void onOpen(OpenEvent<DisclosurePanel> event) {
resize();
}
});
optionsDisPanel.addCloseHandler(new CloseHandler<DisclosurePanel>() {
@Override
public void onClose(CloseEvent<DisclosurePanel> event) {
resize();
}
});
optionsDisPanel.add(optionsGrid);
panel.add(optionsDisPanel);
panel.add(new InlineHTML("<br>"));
panel.add(traceRoute);
panel.add(new InlineHTML("<br>"));
scrollPanel = new ScrollPanel();
scrollPanel.setWidget(panel);
scrollPanel.setWidth("260px");
return scrollPanel;
}
private void initTravelModes() {
travelsModeInOrder=new String[3];
travelsModeInOrder[0]=browserMessages.driving();
travelsModeInOrder[1]=browserMessages.bicycling();
travelsModeInOrder[2]=browserMessages.walking();
travelModes.put(browserMessages.driving(), TravelMode.DRIVING);
travelModes.put(browserMessages.bicycling(), TravelMode.BICYCLING);
travelModes.put(browserMessages.walking(), TravelMode.WALKING);
travelMode=travelModes.get(travelsModeInOrder[0]);
}
private Grid initializeOptionsGrid() {
Grid grid=new Grid(5,2);
grid.setWidget(0, 0, new Label(browserMessages.travelMode()));
grid.setWidget(1, 0, new Label(browserMessages.routeAlternatives()));
grid.setWidget(2, 0, new Label(browserMessages.optimizeWaypoints()));
Label label=new Label(browserMessages.avoidHighways());
disableWidgetsIfNoDriving.add(label);
grid.setWidget(3, 0,label);
label= new Label(browserMessages.avoidTolls());
disableWidgetsIfNoDriving.add(label);
grid.setWidget(4, 0,label);
travelListBox = new ListBox();
travelListBox.setMultipleSelect(false);
for(int i=0;i<travelsModeInOrder.length;i++){
travelListBox.addItem(travelsModeInOrder[i]);
}
travelListBox.addChangeHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent event) {
if(travelModes.containsKey(travelListBox.getItemText(travelListBox.getSelectedIndex()))){
travelMode=travelModes.get(travelListBox.getItemText(travelListBox.getSelectedIndex()));
changeOptions();
} else {
widgetFactory.getDialogBox().showError(
browserMessages.travelModeDoesntExists());
}
}
});
grid.setWidget(0, 1, travelListBox);
ListBox listBox=new ListBox();
listBox.setMultipleSelect(false);
BooleanBoxChangeHandler changeHandler=new BooleanBoxChangeHandler(listBox, browserMessages.yes(), routeAlternatives);
listBox.addItem(browserMessages.yes());
listBox.addItem(browserMessages.no());
listBox.addChangeHandler(changeHandler);
grid.setWidget(1, 1, listBox);
if(routeAlternatives.getBoolean()){
listBox.setSelectedIndex(0);
}else{
listBox.setSelectedIndex(1);
}
listBox=new ListBox();
listBox.setMultipleSelect(false);
changeHandler=new BooleanBoxChangeHandler(listBox, browserMessages.yes(), optimizeWaypoints);
listBox.addItem(browserMessages.yes());
listBox.addItem(browserMessages.no());
listBox.addChangeHandler(changeHandler);
grid.setWidget(2, 1, listBox);
if(optimizeWaypoints.getBoolean()){
listBox.setSelectedIndex(0);
}else{
listBox.setSelectedIndex(1);
}
listBox=new ListBox();
listBox.setMultipleSelect(false);
changeHandler=new BooleanBoxChangeHandler(listBox, browserMessages.yes(), avoidHighways);
disableWidgetsIfNoDriving.add(listBox);
listBox.addItem(browserMessages.yes());
listBox.addItem(browserMessages.no());
listBox.addChangeHandler(changeHandler);
grid.setWidget(3, 1, listBox);
if(avoidHighways.getBoolean()){
listBox.setSelectedIndex(0);
}else{
listBox.setSelectedIndex(1);
}
listBox=new ListBox();
listBox.setMultipleSelect(false);
disableWidgetsIfNoDriving.add(listBox);
changeHandler=new BooleanBoxChangeHandler(listBox, browserMessages.yes(), avoidTolls);
listBox.addItem(browserMessages.yes());
listBox.addItem(browserMessages.no());
listBox.addChangeHandler(changeHandler);
grid.setWidget(4, 1, listBox);
if(avoidTolls.getBoolean()){
listBox.setSelectedIndex(0);
}else{
listBox.setSelectedIndex(1);
}
return grid;
}
private void changeOptions() {
boolean doVisible=false;
if(travelMode==TravelMode.DRIVING){
doVisible=true;
}
for(Widget widget:disableWidgetsIfNoDriving){
widget.setVisible(doVisible);
}
}
private void initializeSearchTextBoxsAndAddButtons() {
KeyPressHandler keyPressHandler=new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
if(dashboardPresenter!=null){
if(event.getNativeEvent().getCharCode() == KeyCodes.KEY_ENTER ){
lastTypeOpen=0;
openMainPopup(0);
}
}
}
};
searchTextBox = new TextBox();
searchTextBox.setSize("170px", "20px");
searchTextBox.addKeyPressHandler(keyPressHandler);
keyPressHandler=new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
if(dashboardPresenter!=null){
if(event.getNativeEvent().getCharCode() == KeyCodes.KEY_ENTER ){
lastTypeOpen=1;
openMainPopup(1);
}
}
}
};
searchTextBox1 = new TextBox();
searchTextBox1.setSize("170px", "20px");
searchTextBox1.addKeyPressHandler(keyPressHandler);
ClickHandler clickHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if(dashboardPresenter!=null){
lastTypeOpen=0;
openMainPopup(0);
}
}
};
addButton = new Button("",clickHandler);
addButton.setSize("32px", "28px");
Image plusIcon = new Image(browserResources.plusIcon());
plusIcon.setSize("20px", "20px");
addButton.getElement().appendChild(plusIcon.getElement());
clickHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if(dashboardPresenter!=null){
lastTypeOpen=1;
openMainPopup(1);
}
}
};
addButton1 = new Button("",clickHandler);
addButton1.setSize("32px", "28px");
plusIcon = new Image(browserResources.plusIcon());
plusIcon.setSize("20px", "20px");
addButton1.getElement().appendChild(plusIcon.getElement());
}
@Override
public Widget asWidget() {
return this;
}
private void traceRoute(){
dashboardPresenter.getDisplay().closeMainPopup();
mapPresenter.getDisplay().getDefaultLayer().getMapView().closeWindow();
List<Point> points = new ArrayList<Point>();
for(GeoResourceGeometry geoRG : route){
LonLat openPoint= OpenLayersAdapter.getLatLng(GeoUtils.getCentroid(geoRG.getGeometry()));
openPoint.transform(geoRG.getGeometry().getProjection(), "EPSG:4326");
TwoDimentionalCoordinate twoCoor=OpenLayersAdapter.getTwoDimentionalCoordinate(openPoint,"EPSG:4326");
points.add(new PointBean(geoRG.getGeometry().getUri(), twoCoor.getX(),twoCoor.getY(),"EPSG:4326"));
}
if(route.size()<2){
widgetFactory.getDialogBox().showError(browserMessages.error2OrMorePoints());
mapPresenter.getDisplay().removePointsStyle(new DrawPointStyle(DrawPointStyle.Style.POLYLINE_ROUTE));
mapPresenter.getDisplay().stopProcessing();
return;
}
mapPresenter.getDisplay().startProcessing();
GetRoutePoints action = new GetRoutePoints(configID.getConfigID(),points);
dispatchAsync.execute(action, new AsyncCallback<GetRoutePointsResult>() {
@Override
public void onFailure(Throwable caught) {
widgetFactory.getDialogBox().showError(browserMessages.errorCommunication());
mapPresenter.getDisplay().removePointsStyle(new DrawPointStyle(DrawPointStyle.Style.POLYLINE_ROUTE));
mapPresenter.getDisplay().stopProcessing();
}
@Override
public void onSuccess(GetRoutePointsResult result) {
mapPresenter.getDisplay().removePointsStyle(new DrawPointStyle(DrawPointStyle.Style.POLYLINE_ROUTE));
List<GeoResource> listGeoResource = new ArrayList<GeoResource>();
List<Point> points = result.getPoints();
if(points.isEmpty()){
executeGoogleDirections();
}else{
Geometry geometry = new PolyLineBean(null, points, points.get(0).getProjection());
GeoResource geoResource = new GeoResource(null,geometry);
listGeoResource.add(geoResource);
mapPresenter.getDisplay().stopProcessing();
mapPresenter.drawGeoResources(listGeoResource, new DrawPointStyle(DrawPointStyle.Style.POLYLINE_ROUTE));
if(points.size()>=2){
mapPresenter.getDisplay().changeZoom(points);
}
}
}
});
}
public void setDashboardPresenter(DashboardPresenter dashboardPresenter){
this.dashboardPresenter=dashboardPresenter;
}
@Override
public void setGeoprocessingDisplay(GeoprocessingPresenter.Display geoprocessingPresenterDisplay) {
this.geoprocessingPresenterDisplay=geoprocessingPresenterDisplay;
}
@Override
public void onResize(){
resizeRoutesWidget();
scrollPanel.onResize();
}
@Override
public void addRoutePoint(GeoResource geoResource, Geometry geometry,RoutesAddGeoResourceType type) {
addGeoResource(geoResource, geometry,type);
doSelectedView();
}
private void removePoint(ClickHandler handler){
route.remove(relationHandler.get(handler).getGeoResourceGeometry());
int row=relationHandler.get(handler).getRow();
if(rows<=2){
gridSearchTextAndAddButton.clear();
if(row==0){
routesWidget.setWidget(row, 0, new Image(GWT.getModuleBaseURL()+new DrawPointStyle(DrawPointStyle.getMinLeter()).getImageURL()));
routesWidget.setWidget(row, 1, searchTextBox);
routesWidget.setWidget(row, 2, addButton);
}
if(row==1){
searchTextBox1.setText(searchTextBox.getText());
searchTextBox.setText("");
routesWidget.setWidget(row, 0, new Image(GWT.getModuleBaseURL()+new DrawPointStyle((char)(DrawPointStyle.getMinLeter()+1)).getImageURL()));
routesWidget.setWidget(row, 1, searchTextBox1);
routesWidget.setWidget(row, 2, addButton1);
}
isSearchFree[row]=true;
}else{
for(int i=row+1;i<rows;i++){
for(PanelWithGeoResourceGeometry tempPanel:relationHandler.values()){
if(tempPanel.getRow()==i){
tempPanel.setRow(tempPanel.getRow()-1);
}
}
char leter=DrawPointStyle.getMinLeter();
if(i-1<DrawPointStyle.getLeterSize()){
leter=(char)(DrawPointStyle.getMinLeter()+i-1);
}else{
leter=DrawPointStyle.getMaxLeter();
}
routesWidget.setWidget(i, 0, new Image(GWT.getModuleBaseURL()+new DrawPointStyle(leter).getImageURL()));
}
routesWidget.removeRow(row);
char leter=DrawPointStyle.getMinLeter();
if(rows-1<DrawPointStyle.getLeterSize()){
leter=(char)(DrawPointStyle.getMinLeter()+rows-1);
}else{
leter=DrawPointStyle.getMaxLeter();
}
gridSearchTextAndAddButton.setWidget(0, 0, new Image(GWT.getModuleBaseURL()+new DrawPointStyle(leter).getImageURL()));
}
relationHandler.remove(handler);
rows--;
resizeRoutesWidget();
mapPresenter.getDisplay().removePointsStyle(new DrawPointStyle(DrawPointStyle.Style.POLYLINE_ROUTE));
if(routeDescriptionWidget!=null){
resultsPresenter.removeWidget(routeDescriptionWidget);
routeDescriptionWidget=null;
}
mapPresenter.removePointsStyle(new DrawPointStyle(DrawPointStyle.getMinLeter()));
if(rows!=1){
for(GeoResourceGeometry i:route){
if(i!=null){
List<GeoResource> resources=new ArrayList<GeoResource>();
resources.add(i.getResource());
mapPresenter.drawGeoResources(resources, new DrawPointStyle((char)(DrawPointStyle.getMinLeter()+route.indexOf(i))));
}
}
}else{
int number=0;
if(!isSearchFree[1]){
number=1;
}if(!isSearchFree[0]){
number=0;
}
List<GeoResource> resources=new ArrayList<GeoResource>();
resources.add(route.get(0).getResource());
mapPresenter.drawGeoResources(resources, new DrawPointStyle((char)(DrawPointStyle.getMinLeter()+number)));
}
}
private void addGeoResource(GeoResource resource, Geometry geometry,RoutesAddGeoResourceType type){
switch (type) {
case RoutesPopup:
if(lastTypeOpen==0){
if(rows<2){
addGeoResourceInRow(resource, geometry, 0);
if(isSearchFree[lastTypeOpen]){
isSearchFree[lastTypeOpen]=false;
rows++;
if(rows==2){
gridSearchTextAndAddButton.setWidget(0, 0, new Image(GWT.getModuleBaseURL()+new DrawPointStyle((char)(DrawPointStyle.getMinLeter()+2)).getImageURL()));
gridSearchTextAndAddButton.setWidget(0, 1, searchTextBox);
gridSearchTextAndAddButton.setWidget(0, 2, addButton);
}
}
}else{
routesWidget.resizeRows(rows+1);
addGeoResourceInRow(resource, geometry, rows);
rows++;
char leter=DrawPointStyle.getMinLeter();
if(rows<DrawPointStyle.getLeterSize()){
leter=(char)(DrawPointStyle.getMinLeter()+rows-1);
}else{
leter=DrawPointStyle.getMaxLeter();
}
gridSearchTextAndAddButton.setWidget(0, 0, new Image(GWT.getModuleBaseURL()+new DrawPointStyle(leter).getImageURL()));
}
}
if(lastTypeOpen==1){
if(rows<2){
addGeoResourceInRow(resource, geometry, 1);
if(isSearchFree[lastTypeOpen]){
isSearchFree[lastTypeOpen]=false;
rows++;
if(rows==2){
gridSearchTextAndAddButton.setWidget(0, 0, new Image(GWT.getModuleBaseURL()+new DrawPointStyle((char)(DrawPointStyle.getMinLeter()+2)).getImageURL()));
gridSearchTextAndAddButton.setWidget(0, 1, searchTextBox);
gridSearchTextAndAddButton.setWidget(0, 2, addButton);
}
}
}
}
break;
case OtherPopup:
int row=-1;
for(int i=0;i<isSearchFree.length;i++){
if(isSearchFree[i]){
row=i;
isSearchFree[i]=false;
break;
}
}
if(row==-1){
routesWidget.resizeRows(rows+1);
addGeoResourceInRow(resource, geometry, rows);
rows++;
char leter=DrawPointStyle.getMinLeter();
if(rows<DrawPointStyle.getLeterSize()){
leter=(char)(DrawPointStyle.getMinLeter()+rows);
}else{
leter=DrawPointStyle.getMaxLeter();
}
gridSearchTextAndAddButton.setWidget(0, 0, new Image(GWT.getModuleBaseURL()+new DrawPointStyle(leter).getImageURL()));
}else{
addGeoResourceInRow(resource, geometry, row);
if(lastTypeOpen==row){
dashboardPresenter.getDisplay().closeMainPopup();
}
rows++;
if(rows==2){
gridSearchTextAndAddButton.setWidget(0, 0, new Image(GWT.getModuleBaseURL()+new DrawPointStyle((char)(DrawPointStyle.getMinLeter()+2)).getImageURL()));
gridSearchTextAndAddButton.setWidget(0, 1, searchTextBox);
gridSearchTextAndAddButton.setWidget(0, 2, addButton);
}
}
break;
}
resizeRoutesWidget();
}
private void addGeoResourceInRow(GeoResource resource, Geometry geometry,int row){
GeoResourceGeometry geoResourceGeometry = new GeoResourceGeometry(resource, geometry);
if(rows==1 && row==0){
GeoResourceGeometry temp=route.get(0);
route.clear();
route.add(geoResourceGeometry);
route.add(temp);
}else{
route.add(geoResourceGeometry);
}
String label=LocaleUtil.getBestLabel(resource);
FlowPanel anchorContainer=new FlowPanel();
Anchor anchor = new Anchor(label, resource.getUri());
anchor.setTarget("_blank");
anchorContainer.add(anchor);
anchorContainer.setSize("170px","100%");
anchorContainer.getElement().getStyle().setProperty("wordWrap", "break-word");
anchorContainer.getElement().getStyle().setTextAlign(TextAlign.CENTER);
anchor.getElement().getStyle().setTextAlign(TextAlign.CENTER);
char leter=DrawPointStyle.getMinLeter();
if(row<DrawPointStyle.getLeterSize()){
leter=(char)(DrawPointStyle.getMinLeter()+row);
}else{
leter=DrawPointStyle.getMaxLeter();
}
DrawPointStyle style= new DrawPointStyle(leter);
List<GeoResource> list= new ArrayList<GeoResource>();
GeoResource centroidResource = new GeoResource(resource.getUri(),GeoUtils.getCentroid(geometry));
list.add(centroidResource);
list.add(resource);
mapPresenter.drawGeoResources(list, style);
routesWidget.setWidget(row, 0, new Image(GWT.getModuleBaseURL()+style.getImageURL()));
routesWidget.setWidget(row, 1, anchorContainer);
routesWidget.getCellFormater().setWidth(row, 1, "100%");
routesWidget.getCellFormater().setHeight(row, 1, "100%");
Button button = new Button();
button.setSize("32px", "28px");
button.getElement().appendChild(new Image(browserResources.eraserIcon()).getElement());
button.getElement().getStyle().setLeft(0, Unit.PX);
routesWidget.setWidget(row, 2, button);
ClickHandler handler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
removePoint(this);
}
};
button.addClickHandler(handler);
relationHandler.put(handler, new PanelWithGeoResourceGeometry(geoResourceGeometry,row));
}
private void resizeRoutesWidget(){
int maxPixelSize=500;
if(geoprocessingPresenterDisplay!=null){
maxPixelSize=geoprocessingPresenterDisplay.getContentHeight();
if(geoprocessingPresenterDisplay.getContentWidth()!=0){
scrollPanel.setWidth(geoprocessingPresenterDisplay.getContentWidth()-10+"px");
}
}
maxPixelSize-=addPointMessage.getOffsetHeight()+gridSearchTextAndAddButton.getOffsetHeight()+traceRoute.getOffsetHeight()+optionsDisPanel.getOffsetHeight();
maxPixelSize-=100;
if(maxPixelSize<0){
maxPixelSize=0;
}
routesWidget.resizeHeight(minPixelHeightOfRoutesWidget,maxPixelSize);
}
private void openMainPopup(int type){
int width=3;
int height=2;
if(dashboardPresenter!=null){
width=dashboardPresenter.getDisplay().getMapPanel().getOffsetWidth();
height=dashboardPresenter.getDisplay().getMapPanel().getOffsetHeight();
}
width=width/3;
height=height/2;
if(width<500){
width=500;
}
if(height<410){
height=410;
}
PopupGeoprocessingView popup=new PopupGeoprocessingView(width,height,dashboardPresenter,browserMessages,browserResources,eventBus,GeoprocessingType.Route);
if(type==0){
popup.search(searchTextBox.getText());
}else{
popup.search(searchTextBox1.getText());
}
if(width>500){
width=width-20;
}
dashboardPresenter.getDisplay().setMainPopup(width,height ,popup,"Geoprocessing");
}
private void doSelectedView() {
geoprocessingPresenterDisplay.doSelectedView(this);
}
@SuppressWarnings("unchecked")
private void executeGoogleDirections(){
DirectionsService service=DirectionsService.newInstance();
DirectionsRequest request = DirectionsRequest.newInstance();
if(route.size()<2){
widgetFactory.getDialogBox().showError(browserMessages.error2OrMorePoints());
mapPresenter.getDisplay().removePointsStyle(new DrawPointStyle(DrawPointStyle.Style.POLYLINE_ROUTE));
mapPresenter.getDisplay().stopProcessing();
return;
}
JsArray<DirectionsWaypoint> waypointsJsArray = (JsArray<DirectionsWaypoint>) (DirectionsWaypoint.createArray());
for(int i=0;i<route.size();i++){
GeoResourceGeometry geoResourceGeometry = route.get(i);
Point point=GeoUtils.getCentroid(geoResourceGeometry.getGeometry());
LonLat openPoint= OpenLayersAdapter.getLatLng(point);
openPoint.transform(point.getProjection(), "EPSG:4326");
LatLng latLng= LatLng.newInstance(openPoint.lat(),openPoint.lon());
DirectionsWaypoint waypoint=DirectionsWaypoint.newInstance();
waypoint.setLocation(latLng);
if(i==0){
request.setOrigin(latLng);
} else if(i==route.size()-1){
request.setDestination(latLng);
}else{
waypointsJsArray.push(waypoint);
}
}
request.setTravelMode(travelMode);
request.setProvideRouteAlternatives(routeAlternatives.getBoolean());
if(travelMode==TravelMode.DRIVING){
request.setAvoidHighways(avoidHighways.getBoolean());
request.setAvoidTolls(avoidTolls.getBoolean());
}else{
request.setAvoidHighways(true);
request.setAvoidTolls(true);
}
request.setOptimizeWaypoints(optimizeWaypoints.getBoolean());
request.setWaypoints(waypointsJsArray);
service.route(request, new DirectionsResultHandler() {
@Override
public void onCallback(DirectionsResult result,
DirectionsStatus status) {
googleCallback(result, status);
}
});
}
private void googleCallback(DirectionsResult result,
DirectionsStatus status){
switch (status) {
case OK:
initRoute(result);
return;
case ZERO_RESULTS:
dashboardPresenter.getDisplay().setMainPopup(200,150,getPopupWidget(browserMessages.zeroResults()),"Center");
break;
case MAX_WAYPOINTS_EXCEEDED:
dashboardPresenter.getDisplay().setMainPopup(200,150,getPopupWidget(browserMessages.maxWaypointsExceeded()),"Center");
break;
case OVER_QUERY_LIMIT:
dashboardPresenter.getDisplay().setMainPopup(200,150,getPopupWidget(browserMessages.overQueryLimit()),"Center");
break;
case UNKNOWN_ERROR:
dashboardPresenter.getDisplay().setMainPopup(200,150,getPopupWidget(browserMessages.unknownError()),"Center");
break;
case REQUEST_DENIED:
dashboardPresenter.getDisplay().setMainPopup(200,150,getPopupWidget(browserMessages.requestDenied()),"Center");
break;
default:
widgetFactory.getDialogBox().showError(browserMessages.errorGoogleDirections(status.toString()));
break;
}
mapPresenter.getDisplay().removePointsStyle(new DrawPointStyle(DrawPointStyle.Style.POLYLINE_ROUTE));
mapPresenter.getDisplay().stopProcessing();
if(routeDescriptionWidget!=null){
resultsPresenter.removeWidget(routeDescriptionWidget);
routeDescriptionWidget=null;
}
}
private void initRoute(DirectionsResult result){
if(routeDescriptionWidget==null){
routeDescriptionWidget=new RoutesDescriptionWidget(result.getRoutes(),route,routeSelectedCallback,browserMessages);
}else{
resultsPresenter.removeWidget(routeDescriptionWidget);
routeDescriptionWidget=new RoutesDescriptionWidget(result.getRoutes(), route,routeSelectedCallback, browserMessages);
}
resultsPresenter.addWidget(routeDescriptionWidget, browserMessages.routes());
resultsPresenter.doSelectedWidget(routeDescriptionWidget);
dashboardPresenter.getDisplay().doSelectedWestWidget(resultsPresenter.getDisplay().asWidget());
mapPresenter.getDisplay().stopProcessing();
}
private void drawSelectedRoute(DirectionsRoute directionRoute){
mapPresenter.getDisplay().removePointsStyle(new DrawPointStyle(DrawPointStyle.Style.POLYLINE_ROUTE));
List<Point> points=new ArrayList<Point>();
for(int j=0;j<directionRoute.getOverview_Path().length();j++){
Double lat=directionRoute.getOverview_Path().get(j).getLatitude();
Double lng=directionRoute.getOverview_Path().get(j).getLongitude();
points.add(new PointBean("", lng, lat,"EPSG:4326"));
}
Geometry geometry = new PolyLineBean(null, points,"EPSG:4326");
GeoResource geoResource = new GeoResource(null,geometry);
List<GeoResource> list=new ArrayList<GeoResource>();
list.add(geoResource);
mapPresenter.drawGeoResources(list,new DrawPointStyle(DrawPointStyle.Style.POLYLINE_ROUTE));
if(points.size()>=2){
mapPresenter.getDisplay().changeZoom(points);
}
}
private Widget getPopupWidget(String error){
VerticalPanel panel=new VerticalPanel();
panel.setSize("100%", "100%");
panel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
Label errorLabel=new Label(error);
errorLabel.setHeight("70px");
errorLabel.getElement().getStyle().setTextAlign(TextAlign.CENTER);
panel.add(errorLabel);
panel.setCellVerticalAlignment(errorLabel, HasVerticalAlignment.ALIGN_TOP);
Button button=new Button(browserMessages.close());
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dashboardPresenter.getDisplay().closeMainPopup();
}
});
panel.add(button);
panel.setCellVerticalAlignment(button, HasVerticalAlignment.ALIGN_BOTTOM);
return panel;
}
@Override
public void resize() {
onResize();
}
private class BooleanBoxChangeHandler implements ChangeHandler{
private ListBox listBox;
private String valueTrue;
private MyBoolean toChange;
public BooleanBoxChangeHandler(ListBox listBox,String valueTrue,MyBoolean toChange){
this.listBox=listBox;
this.valueTrue=valueTrue;
this.toChange=toChange;
}
@Override
public void onChange(ChangeEvent event) {
if(listBox.getItemText(listBox.getSelectedIndex()).equals(valueTrue)){
this.toChange.setBoolean(true);
}else{
this.toChange.setBoolean(false);
}
}
}
private class MyBoolean{
private boolean bool;
public MyBoolean(boolean bool){
this.bool=bool;
}
public boolean getBoolean() {
return bool;
}
public void setBoolean(boolean bool) {
this.bool = bool;
}
}
}