diff options
Diffstat (limited to 'js/dojo/dojox/geo/openlayers/WidgetFeature.js')
| -rw-r--r-- | js/dojo/dojox/geo/openlayers/WidgetFeature.js | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/js/dojo/dojox/geo/openlayers/WidgetFeature.js b/js/dojo/dojox/geo/openlayers/WidgetFeature.js new file mode 100644 index 0000000..530fcd9 --- /dev/null +++ b/js/dojo/dojox/geo/openlayers/WidgetFeature.js @@ -0,0 +1,206 @@ +//>>built +define( + "dojox/geo/openlayers/WidgetFeature", ["dojo/_base/kernel", "dojo/_base/declare", "dojo/_base/html", "dojo/_base/lang", "dojox/geo/openlayers/Feature"], + function(dojo, declare, html, lang, Feature){ + /*===== + var Feature = dojox.geo.openlayers.Feature; + =====*/ + return declare("dojox.geo.openlayers.WidgetFeature", Feature, { + // summary: + // Wraps a Dojo widget, provide geolocalisation of the widget and interface + // to Layer class. + // description: + // This class allows to add a widget in a `dojox.geo.openlayers.Layer`. + // Parameters are passed to the constructor. These parameters describe the widget + // and provide geo-localisation of this widget. + // parameters can be: + // * _createWidget_: Function for widget creation. Must return a `dijit._Widget`. + // * _dojoType_: The class of a widget to create; + // * _dijitId_: The digitId of an existing widget. + // * _widget_: An already created widget. + // * _width_: The width of the widget. + // * _height_: The height of the widget. + // * _longitude_: The longitude, in decimal degrees where to place the widget. + // * _latitude_: The latitude, in decimal degrees where to place the widget. + // You must define a least one widget retrieval parameter and the geo-localization parameters. + _widget : null, + _bbox : null, + + constructor : function(params){ + // summary: + // Constructs a new `dojox.geo.openlayers.WidgetFeature` + // params: Object + // The parameters describing the widget. + this._params = params; + }, + + setParameters : function(params){ + // summary: + // Sets the parameters describing the widget. + // params: Object + // The parameters describing the widget. + this._params = params; + }, + + getParameters : function(){ + // summary: + // Retreives the parameters describing the widget. + // returns: Object + // The parameters describing the widget. + return this._params; + }, + + _getWidget : function(){ + // summary: + // Creates, if necessary the widget and returns it; + // tags: + // private + var params = this._params; + + if ((this._widget == null) && (params != null)) { + var w = null; + + if (typeof (params.createWidget) == "function") { + w = params.createWidget.call(this); + } else if (params.dojoType) { + dojo["require"](params.dojoType); + var c = lang.getObject(params.dojoType); + w = new c(params); + } else if (params.dijitId) { + w = dijit.byId(params.dijitId); + } else if (params.widget) { + w = params.widget; + } + + if (w != null) { + this._widget = w; + if (typeof (w.startup) == "function") + w.startup(); + var n = w.domNode; + if (n != null) + html.style(n, { + position : "absolute" + }); + } + this._widget = w; + } + return this._widget; + }, + + _getWidgetWidth : function(){ + // summary: + // gets the widget width + // tags: + // private + var p = this._params; + if (p.width) + return p.width; + var w = this._getWidget(); + if (w) + return html.style(w.domNode, "width"); + return 10; + }, + + _getWidgetHeight : function(){ + // summary: + // gets the widget height + // tags: + // private + var p = this._params; + if (p.height) + return p.height; + var w = this._getWidget(); + if (w) + return html.style(w.domNode, "height"); + return 10; + }, + + render : function(){ + // summary: + // renders the widget. + // descrption: + // Places the widget accordingly to longitude and latitude defined in parameters. + // This function is called when the center of the maps or zoom factor changes. + var layer = this.getLayer(); + + var widget = this._getWidget(); + if (widget == null) + return; + var params = this._params; + var lon = params.longitude; + var lat = params.latitude; + var from = this.getCoordinateSystem(); + var map = layer.getDojoMap(); + var p = map.transformXY(lon, lat, from); + var a = this._getLocalXY(p); + + var width = this._getWidgetWidth(); + var height = this._getWidgetHeight(); + + var x = a[0] - width / 2; + var y = a[1] - height / 2; + var dom = widget.domNode; + + var pa = layer.olLayer.div; + if (dom.parentNode != pa) { + if (dom.parentNode) + dom.parentNode.removeChild(dom); + pa.appendChild(dom); + } + this._updateWidgetPosition({ + x : x, + y : y, + width : width, + height : height + }); + }, + + _updateWidgetPosition : function(box){ + // summary: + // Places the widget with the computed x and y values + // tags: + // private + // var box = this._params; + + var w = this._widget; + var dom = w.domNode; + + html.style(dom, { + position : "absolute", + left : box.x + "px", + top : box.y + "px", + width : box.width + "px", + height : box.height + "px" + }); + + if (w.srcNodeRef) { + html.style(w.srcNodeRef, { + position : "absolute", + left : box.x + "px", + top : box.y + "px", + width : box.width + "px", + height : box.height + "px" + }); + } + + if (lang.isFunction(w.resize)) + w.resize({ + w : box.width, + h : box.height + }); + }, + + remove : function(){ + // summary: + // removes this feature. + // description: + // Remove this feature by disconnecting the widget from the dom. + var w = this.getWidget(); + if (!w) + return; + var dom = w.domNode; + if (dom.parentNode) + dom.parentNode.removeChild(dom); + } + }); + }); |
