001    package com.google.gwt.maps.client.streetview;
002    
003    import com.google.gwt.core.client.JavaScriptObject;
004    import com.google.gwt.core.client.JsArray;
005    import com.google.gwt.dom.client.Element;
006    import com.google.gwt.event.shared.HandlerRegistration;
007    import com.google.gwt.maps.client.base.LatLng;
008    import com.google.gwt.maps.client.events.MapEventType;
009    import com.google.gwt.maps.client.events.MapHandlerRegistration;
010    import com.google.gwt.maps.client.events.closeclick.CloseClickEventFormatter;
011    import com.google.gwt.maps.client.events.closeclick.CloseClickMapHandler;
012    import com.google.gwt.maps.client.events.links.LinksChangeEventFormatter;
013    import com.google.gwt.maps.client.events.links.LinksChangeMapHandler;
014    import com.google.gwt.maps.client.events.pano.PanoChangeEventFormatter;
015    import com.google.gwt.maps.client.events.pano.PanoChangeMapHandler;
016    import com.google.gwt.maps.client.events.position.PositionChangeEventFormatter;
017    import com.google.gwt.maps.client.events.position.PositionChangeMapHandler;
018    import com.google.gwt.maps.client.events.pov.PovChangeEventFormatter;
019    import com.google.gwt.maps.client.events.pov.PovChangeMapHandler;
020    import com.google.gwt.maps.client.events.resize.ResizeEventFormatter;
021    import com.google.gwt.maps.client.events.resize.ResizeMapHandler;
022    import com.google.gwt.maps.client.events.visible.VisibleChangeEventFormatter;
023    import com.google.gwt.maps.client.events.visible.VisibleChangeMapHandler;
024    import com.google.gwt.maps.client.mvc.MVCArray;
025    import com.google.gwt.maps.client.mvc.MVCObject;
026    import com.google.gwt.maps.client.workaround.WorkAroundUtils;
027    
028    /**
029     * Displays the panorama for a given LatLng or panorama ID. A StreetViewPanorama object provides a Street View "viewer" which can be stand-alone within a separate <code>&lt;div&gt;</code> or bound to a Map. This class extends MVCObject.
030     * <br><br>
031     * See <a href="https://developers.google.com/maps/documentation/javascript/reference#StreetViewPanorama">StreetViewPanorama API Doc</a>
032     */
033    public class StreetViewPanoramaImpl extends MVCObject<StreetViewPanoramaImpl> {
034      
035      /**
036       * Displays the panorama for a given LatLng or panorama ID. A StreetViewPanorama object provides a Street View "viewer" which can be stand-alone within a separate <code>&lt;div&gt;</code> or bound to a Map. This class extends MVCObject.
037       * use newInstance();
038       */
039      protected StreetViewPanoramaImpl() {}
040    
041      /**
042       * creates Displays the panorama for a given LatLng or panorama ID. A StreetViewPanorama object provides a Street View "viewer" which can be stand-alone within a separate <code>&lt;div&gt;</code> or bound to a Map. This class extends MVCObject.
043       * @param element {@link Element}
044       * @param options {@link StreetViewPanoramaOptions}
045       * @return {@link StreetViewPanoramaImpl}
046       */
047      public static StreetViewPanoramaImpl newInstance(Element element, StreetViewPanoramaOptions options) {
048        JavaScriptObject jso = createJso(element, options);
049        WorkAroundUtils.removeGwtObjectId(jso);
050        return jso.cast();
051      }
052    
053      private final static native JavaScriptObject createJso(Element container, StreetViewPanoramaOptions opts) /*-{
054        return new $wnd.google.maps.StreetViewPanorama(container, opts)
055      }-*/;
056      
057      /**
058       * Returns the set of navigation links for the Street View panorama.
059       */
060      public final native JsArray<StreetViewLink> getLinks() /*-{
061        return this.getLinks();
062      }-*/;
063      
064      /**
065       * Returns the current panorama ID for the Street View panorama. This id is stable within the browser's current session only.
066       */
067      public final native String getPano() /*-{
068        return this.getPano();
069      }-*/;
070      
071      /**
072       * Returns the current LatLng position for the Street View panorama.
073       */
074      public final native LatLng getPosition() /*-{
075        return this.getPosition();
076      }-*/;
077      
078      /**
079       * Returns the current point of view for the Street View panorama.
080       */
081      public final native StreetViewPov getPov() /*-{
082        return this.getPov();
083      }-*/;
084      
085      /**
086       * Returns true if the panorama is visible. It does not specify whether Street View imagery is available at the specified position.
087       */
088      public final native boolean getVisible() /*-{
089        return this.getVisible();
090      }-*/;
091      
092      /**
093       * Set the custom panorama provider called on pano change to load custom panoramas.
094       * @param provider
095       */
096      public final native void registerPanoProvider(StreetViewPanoramaProvider provider) /*-{ 
097        this.panoProvider = function(pano, zoom, tileX, tileY) {
098          provider.@com.google.gwt.maps.client.streetview.StreetViewPanoramaProvider::getPanoData(Ljava/lang/String;III)(pano, zoom, tileX, tileY); 
099        }
100      }-*/;
101      
102      /**
103       * Sets the current panorama ID for the Street View panorama.
104       * @param pano
105       */
106      public final native void setPano(String pano) /*-{
107        this.setPano(pano);
108      }-*/;
109      
110      /**
111       * Sets the current LatLng position for the Street View panorama.
112       * @param latLng
113       */
114      public final native void setPosition(LatLng latLng) /*-{
115        this.setPosition(latLng);
116      }-*/;
117      
118      /**
119       * Sets the point of view for the Street View panorama.
120       * @param pov
121       */
122      public final native void setPov(StreetViewPov pov) /*-{
123        this.setPov(pov);
124      }-*/;
125      
126      /**
127       * Sets to true to make the panorama visible. If set to false, the panorama will be hidden whether it is embedded in the map or in its own <code>&lt;div&gt;</code>.
128       * @param visible
129       */
130      public final native void setVisible(boolean visible) /*-{
131        this.setVisible(visible);
132      }-*/;
133      
134      /**
135       * TODO
136       * Additional controls to attach to the panorama. To add a control to the panorama, add the control's <code>&lt;div&gt;</code> to the MVCArray corresponding to the ControlPosition where it should be rendered.
137       * @param controls
138       */
139      public final native void setControls(MVCArray<Element> controls) /*-{
140        this.controls = controls;
141      }-*/;
142      
143      /**
144       * This event is fired when the close button is clicked.
145       * @param handler
146       */
147      public final HandlerRegistration addCloseClickHandler(CloseClickMapHandler handler) {
148        return MapHandlerRegistration.addHandler(this, MapEventType.CLOSECLICK, handler, new CloseClickEventFormatter());
149      }
150      
151      /**
152       * This event is fired when the panorama's links change. The links change asynchronously following a pano id change.
153       * @param handler
154       */
155      public final HandlerRegistration addLinksChangeHandler(LinksChangeMapHandler handler) {
156        return MapHandlerRegistration.addHandler(this, MapEventType.LINKS_CHANGED, handler, new LinksChangeEventFormatter());
157      }
158     
159      /**
160       * This event is fired when the panorama's pano id changes. The pano may change as the user navigates through the panorama or the position is manually set. Note that not all position changes trigger a pano_changed.
161       * @param handler
162       */
163      public final HandlerRegistration addPanoChangeHandler(PanoChangeMapHandler handler) {
164        return MapHandlerRegistration.addHandler(this, MapEventType.PANO_CHANGED, handler, new PanoChangeEventFormatter());
165      }
166      
167      /**
168       * This event is fired when the panorama's position changes. The position changes as the user navigates through the panorama or the position is set manually.
169       * @param handler
170       */
171      public final HandlerRegistration addPositionChangeHandler(PositionChangeMapHandler handler) {
172        return MapHandlerRegistration.addHandler(this, MapEventType.POSITION_CHANGED, handler, new PositionChangeEventFormatter());
173      }
174      
175      /**
176       * This event is fired when the panorama's point-of-view changes. The point of view changes as the pitch, zoom, or heading changes.
177       * @param handler
178       */
179      public final HandlerRegistration addPovChangeHandler(PovChangeMapHandler handler) {
180        return MapHandlerRegistration.addHandler(this, MapEventType.POV_CHANGED, handler, new PovChangeEventFormatter());
181      }
182      
183      /**
184       * Developers should trigger this event on the panorama when its div changes size: google.maps.event.trigger(panorama, 'resize').
185       * @param handler
186       */
187      public final HandlerRegistration addResizeHandler(ResizeMapHandler handler) {
188        return MapHandlerRegistration.addHandler(this, MapEventType.RESIZE, handler, new ResizeEventFormatter());
189      }
190      
191      /**
192       * This event is fired when the panorama's visibility changes. The visibility is changed when the Pegman id dragged onto the map, the close button is clicked, or setVisible() is called.
193       * @param handler
194       */
195      public final HandlerRegistration addVisibleChangeHandler(VisibleChangeMapHandler handler) {
196        return MapHandlerRegistration.addHandler(this, MapEventType.VISIBLE_CHANGED, handler, new VisibleChangeEventFormatter());
197      }
198      
199    }