001    package com.google.gwt.maps.client.services;
002    
003    import com.google.gwt.core.client.JavaScriptObject;
004    import com.google.gwt.maps.client.workaround.WorkAroundUtils;
005    
006    /**
007     * A service for computing directions between two or more places.
008     * <br><br>
009     * See <a href="https://developers.google.com/maps/documentation/javascript/reference#DirectionsService">DirectionsService API Doc</a>
010     */
011    public class DirectionsService extends JavaScriptObject {
012      
013      /**
014       * use newInstance();
015       */
016      protected DirectionsService() {}
017    
018      /**
019       * Creates a new instance of a DirectionsService that sends directions queries to Google servers.
020       */
021      public static final DirectionsService newInstance() {
022        JavaScriptObject jso = createJso();
023        WorkAroundUtils.removeGwtObjectId(jso);
024        return jso.cast();
025      }
026    
027      private static final native JavaScriptObject createJso() /*-{
028        return new $wnd.google.maps.DirectionsService();
029      }-*/;
030      
031      /**
032       * Issue a directions search request.
033       * 
034       *  TODO I can't test this in dev mode, but seems to be working in production deployed. maps api can't find <__gwt_ObjectId>
035       * 
036       * @param request
037       * @param handler
038       */
039      public final native void route(DirectionsRequest request, DirectionsResultHandler handler) /*-{
040        var callback = function(result, status) {
041          
042          // debug
043          //@com.google.gwt.maps.client.services.DirectionsService::test(Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)("result=", result);
044          //@com.google.gwt.maps.client.services.DirectionsService::test(Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)("status=", status);
045    
046          // process callback
047          @com.google.gwt.maps.client.services.DirectionsService::routeImpl(Lcom/google/gwt/maps/client/services/DirectionsResult;Ljava/lang/String;Lcom/google/gwt/maps/client/services/DirectionsResultHandler;)(result, status, handler);
048        };
049        
050    //    // this works - but the incoming request2 jso, matches exactly yet, won't work, ????
051    //    var request2 = {
052    //      origin: "Arlington, WA",
053    //      destination: "Seattle, WA",
054    //      travelMode: "DRIVING" // or is $wnd.google.maps.TravelMode.DRIVING
055    //    };
056        
057        // output the object for debugging
058        //@com.google.gwt.maps.client.services.DirectionsService::test(Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)("request", request);
059        //@com.google.gwt.maps.client.services.DirectionsService::test(Ljava/lang/String;Lcom/google/gwt/core/client/JavaScriptObject;)("request2=", request2);
060        
061        this.route(request, callback);
062      }-*/;
063      
064      private static final void routeImpl(DirectionsResult result, String status, DirectionsResultHandler handler) {
065        handler.onCallback(result, DirectionsStatus.fromValue(status));
066      }
067      
068    //  public static final void test(String msg, JavaScriptObject jso) {
069    //    JSONObject j = new JSONObject(jso);
070    //    GWT.log("msg= "+ msg + " jso=" + j.toString());
071    //  }
072    //  
073     
074    }