]> git.openstreetmap.org Git - rails.git/blobdiff - public/lib/OpenLayers/Control/PanZoom.js
openlayers madness
[rails.git] / public / lib / OpenLayers / Control / PanZoom.js
diff --git a/public/lib/OpenLayers/Control/PanZoom.js b/public/lib/OpenLayers/Control/PanZoom.js
new file mode 100644 (file)
index 0000000..32eed2f
--- /dev/null
@@ -0,0 +1,164 @@
+/* Copyright (c) 2006 MetaCarta, Inc., published under the BSD license.
+ * See http://svn.openlayers.org/trunk/openlayers/license.txt for the full
+ * text of the license. */
+// @require: OpenLayers/Control.js
+
+/**
+ * @class
+ * 
+ * default zoom/pan controls
+ */
+OpenLayers.Control.PanZoom = Class.create();
+OpenLayers.Control.PanZoom.X = 4;
+OpenLayers.Control.PanZoom.Y = 4;
+OpenLayers.Control.PanZoom.prototype = 
+  Object.extend( new OpenLayers.Control(), {
+
+    /** @type int */
+    slideFactor: 50,
+
+    /** @type Array of Button Divs */
+    buttons: null,
+
+    /** @type OpenLayers.Pixel */
+    position: null,
+
+    /**
+     * @constructor
+     */
+    initialize: function() {
+        OpenLayers.Control.prototype.initialize.apply(this, arguments);
+        this.position = new OpenLayers.Pixel(OpenLayers.Control.PanZoom.X,
+                                             OpenLayers.Control.PanZoom.Y);
+    },
+
+    /**
+    * @param {OpenLayers.Pixel} px
+    * 
+    * @returns A reference to the container div for the PanZoom control
+    * @type DOMElement
+    */
+    draw: function(px) {
+        // initialize our internal div
+        OpenLayers.Control.prototype.draw.apply(this, arguments);
+        px = this.position;
+
+        // place the controls
+        this.buttons = new Array();
+
+        var sz = new OpenLayers.Size(18,18);
+        var centered = new OpenLayers.Pixel(px.x+sz.w/2, px.y);
+
+        this._addButton("panup", "north-mini.png", centered, sz);
+        px.y = centered.y+sz.h;
+        this._addButton("panleft", "west-mini.png", px, sz);
+        this._addButton("panright", "east-mini.png", px.add(sz.w, 0), sz);
+        this._addButton("pandown", "south-mini.png", 
+                        centered.add(0, sz.h*2), sz);
+        this._addButton("zoomin", "zoom-plus-mini.png", 
+                        centered.add(0, sz.h*3+5), sz);
+        this._addButton("zoomworld", "zoom-world-mini.png", 
+                        centered.add(0, sz.h*4+5), sz);
+        this._addButton("zoomout", "zoom-minus-mini.png", 
+                        centered.add(0, sz.h*5+5), sz);
+        return this.div;
+    },
+    
+    /**
+     * @param {String} id
+     * @param {String} img
+     * @param {OpenLayers.Pixel} xy
+     * @param {OpenLayers.Size} sz
+     * 
+     * @returns A Div (an alphaImageDiv, to be precise) that contains the 
+     *          image of the button, and has all the proper event handlers
+     *          set.
+     * @type DOMElement
+     */
+    _addButton:function(id, img, xy, sz) {
+        var imgLocation = OpenLayers.Util.getImagesLocation() + img;
+        // var btn = new ol.AlphaImage("_"+id, imgLocation, xy, sz);
+        var btn = OpenLayers.Util.createAlphaImageDiv(
+                                    "OpenLayers_Control_PanZoom_" + id, 
+                                    xy, sz, imgLocation, "absolute");
+
+        //we want to add the outer div
+        this.div.appendChild(btn);
+
+        btn.onmousedown = this.buttonDown.bindAsEventListener(btn);
+        btn.ondblclick  = this.doubleClick.bindAsEventListener(btn);
+        btn.onclick  = this.doubleClick.bindAsEventListener(btn);
+        btn.action = id;
+        btn.map = this.map;
+        btn.slideFactor = this.slideFactor;
+
+        //we want to remember/reference the outer div
+        this.buttons.push(btn);
+        return btn;
+    },
+    
+    /**
+     * @param {event} evt
+     * 
+     * @type Boolean
+     */
+    doubleClick: function (evt) {
+        Event.stop(evt);
+        return false;
+    },
+    
+    /**
+     * @param {event} evt
+     */
+    buttonDown: function (evt) {
+        if (!Event.isLeftClick(evt)) return;
+
+        var slide = this.map.getResolution() * this.slideFactor;
+        var center = this.map.getCenter();
+
+        var newCenter = center.copyOf();
+
+        switch (this.action) {
+            case "panup": 
+                newCenter = newCenter.add( 0, slide);
+                break;
+            case "pandown": 
+                newCenter = newCenter.add( 0, -slide);
+                break;
+            case "panleft": 
+                newCenter = newCenter.add( -slide, 0);
+                break;
+            case "panright": 
+                newCenter = newCenter.add( slide, 0);
+                break;
+            case "zoomin": 
+                this.map.zoomIn(); 
+                break;
+            case "zoomout": 
+                this.map.zoomOut(); 
+                break;
+            case "zoomworld": 
+                this.map.zoomToFullExtent(); 
+                break;
+        }
+        
+        if (!newCenter.equals(center)) {
+            this.map.setCenter(newCenter);
+        }
+        
+        Event.stop(evt);
+    },
+
+    /**
+     * 
+     */
+    destroy: function() {
+        OpenLayers.Control.prototype.destroy.apply(this, arguments);
+        for(i=0; i<this.buttons.length; i++) {
+            this.buttons[i].map = null;
+        }
+    },
+    
+    /** @final @type String */
+    CLASS_NAME: "OpenLayers.Control.PanZoom"
+});