diff --git a/lib/OpenLayers.js b/lib/OpenLayers.js index aaf8a51104..0ac4aa0323 100644 --- a/lib/OpenLayers.js +++ b/lib/OpenLayers.js @@ -202,7 +202,6 @@ "OpenLayers/Control/TransformFeature.js", "OpenLayers/Control/SLDSelect.js", "OpenLayers/Geometry.js", - "OpenLayers/Geometry/Rectangle.js", "OpenLayers/Geometry/Collection.js", "OpenLayers/Geometry/Point.js", "OpenLayers/Geometry/MultiPoint.js", diff --git a/lib/OpenLayers/Control/TransformFeature.js b/lib/OpenLayers/Control/TransformFeature.js index 437124bfcf..571963146c 100644 --- a/lib/OpenLayers/Control/TransformFeature.js +++ b/lib/OpenLayers/Control/TransformFeature.js @@ -166,6 +166,15 @@ OpenLayers.Control.TransformFeature = OpenLayers.Class(OpenLayers.Control, { */ dragControl: null, + /** + * APIProperty: irregular + * {Boolean} Make scaling/resizing work irregularly. If true then + * dragging a handle causes the feature to resize in the direction + * of movement. If false then the feature resizes symetrically + * about it's center. + */ + irregular: false, + /** * Constructor: OpenLayers.Control.TransformFeature * Create a new transform feature control. @@ -390,6 +399,10 @@ OpenLayers.Control.TransformFeature = OpenLayers.Class(OpenLayers.Control, { var dy1 = this.y - centerGeometry.y; var dx0 = dx1 - (this.x - oldGeom.x); var dy0 = dy1 - (this.y - oldGeom.y); + if (control.irregular && !control._setfeature) { + dx1 -= (this.x - oldGeom.x) / 2; + dy1 -= (this.y - oldGeom.y) / 2; + } this.x = oldX; this.y = oldY; var scale, ratio = 1; @@ -411,6 +424,13 @@ OpenLayers.Control.TransformFeature = OpenLayers.Class(OpenLayers.Control, { control.box.geometry.resize(scale, centerGeometry, ratio); control.box.geometry.rotate(control.rotation, centerGeometry); control.transformFeature({scale: scale, ratio: ratio}); + if (control.irregular && !control._setfeature) { + var newCenter = centerGeometry.clone(); + newCenter.x += Math.abs(oldX - centerGeometry.x) < 0.00001 ? 0 : (this.x - oldX); + newCenter.y += Math.abs(oldY - centerGeometry.y) < 0.00001 ? 0 : (this.y - oldY); + control.box.geometry.move(this.x - oldX, this.y - oldY); + control.transformFeature({center: newCenter}); + } }; // Override for rotation handle move - make sure that the box and diff --git a/lib/OpenLayers/Geometry/Rectangle.js b/lib/OpenLayers/Geometry/Rectangle.js deleted file mode 100644 index 5f05cbedbb..0000000000 --- a/lib/OpenLayers/Geometry/Rectangle.js +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright (c) 2006-2011 by OpenLayers Contributors (see authors.txt for - * full list of contributors). Published under the Clear BSD license. - * See http://svn.openlayers.org/trunk/openlayers/license.txt for the - * full text of the license. */ - -/** - * @requires OpenLayers/Geometry.js - */ - -/** - * Class: OpenLayers.Geometry.Rectangle - * This class is *not supported*, and probably isn't what you're looking for. - * Instead, most users probably want something like: - * (code) - * var poly = new OpenLayers.Bounds(0,0,10,10).toGeometry(); - * (end) - * This will create a rectangular Polygon geometry. - * - * Inherits: - * - - */ - -OpenLayers.Geometry.Rectangle = OpenLayers.Class(OpenLayers.Geometry, { - - /** - * Property: x - * {Float} - */ - x: null, - - /** - * Property: y - * {Float} - */ - y: null, - - /** - * Property: width - * {Float} - */ - width: null, - - /** - * Property: height - * {Float} - */ - height: null, - - /** - * Constructor: OpenLayers.Geometry.Rectangle - * - * Parameters: - * points - {Array()} - */ - initialize: function(x, y, width, height) { - OpenLayers.Geometry.prototype.initialize.apply(this, arguments); - - this.x = x; - this.y = y; - - this.width = width; - this.height = height; - }, - - /** - * Method: calculateBounds - * Recalculate the bounds for the geometry. - */ - calculateBounds: function() { - this.bounds = new OpenLayers.Bounds(this.x, this.y, - this.x + this.width, - this.y + this.height); - }, - - - /** - * APIMethod: getLength - * - * Returns: - * {Float} The length of the geometry - */ - getLength: function() { - var length = (2 * this.width) + (2 * this.height); - return length; - }, - - /** - * APIMethod: getArea - * - * Returns: - * {Float} The area of the geometry - */ - getArea: function() { - var area = this.width * this.height; - return area; - }, - - CLASS_NAME: "OpenLayers.Geometry.Rectangle" -}); diff --git a/lib/deprecated.js b/lib/deprecated.js index b7f1ef4f33..8d906459a9 100644 --- a/lib/deprecated.js +++ b/lib/deprecated.js @@ -20,8 +20,10 @@ * @requires OpenLayers/Format/JSON.js * @requires OpenLayers/Format/WKT.js * @requires OpenLayers/Format/XML.js + * @requires OpenLayers/Geometry.js */ + /** * Namespace: OpenLayers.Class */ @@ -4869,3 +4871,94 @@ OpenLayers.Layer.GML = OpenLayers.Class(OpenLayers.Layer.Vector, { CLASS_NAME: "OpenLayers.Layer.GML" }); + +/** + * Class: OpenLayers.Geometry.Rectangle + * This class is *not supported*, and probably isn't what you're looking for. + * Instead, most users probably want something like: + * (code) + * var poly = new OpenLayers.Bounds(0,0,10,10).toGeometry(); + * (end) + * This will create a rectangular Polygon geometry. + * + * Inherits: + * - + */ + +OpenLayers.Geometry.Rectangle = OpenLayers.Class(OpenLayers.Geometry, { + + /** + * Property: x + * {Float} + */ + x: null, + + /** + * Property: y + * {Float} + */ + y: null, + + /** + * Property: width + * {Float} + */ + width: null, + + /** + * Property: height + * {Float} + */ + height: null, + + /** + * Constructor: OpenLayers.Geometry.Rectangle + * + * Parameters: + * points - {Array()} + */ + initialize: function(x, y, width, height) { + OpenLayers.Geometry.prototype.initialize.apply(this, arguments); + + this.x = x; + this.y = y; + + this.width = width; + this.height = height; + }, + + /** + * Method: calculateBounds + * Recalculate the bounds for the geometry. + */ + calculateBounds: function() { + this.bounds = new OpenLayers.Bounds(this.x, this.y, + this.x + this.width, + this.y + this.height); + }, + + + /** + * APIMethod: getLength + * + * Returns: + * {Float} The length of the geometry + */ + getLength: function() { + var length = (2 * this.width) + (2 * this.height); + return length; + }, + + /** + * APIMethod: getArea + * + * Returns: + * {Float} The area of the geometry + */ + getArea: function() { + var area = this.width * this.height; + return area; + }, + + CLASS_NAME: "OpenLayers.Geometry.Rectangle" +}); diff --git a/notes/2.12.md b/notes/2.12.md index eaad3e9753..42f2ce0e7d 100644 --- a/notes/2.12.md +++ b/notes/2.12.md @@ -109,7 +109,7 @@ Without the WKT format included (by default), the `OpenLayers.Geometry::toString ## Deprecated Components -A number of constructors have been marked as deprecated for multiple releases in the 2.x series. For the 2.12 release this deprecated functionality has been moved to a separate deprecated.js file. If you use any of the constructors or methods below, you will have to explicitly include the deprecated.js file in your build (or add it in a separate ` diff --git a/tests/Test.AnotherWay.geom_eq.js b/tests/Test.AnotherWay.geom_eq.js index 3e3ad8486f..893c5b5a2f 100644 --- a/tests/Test.AnotherWay.geom_eq.js +++ b/tests/Test.AnotherWay.geom_eq.js @@ -34,6 +34,35 @@ } } + /** + * Function assertFloatEqual + * Test two objects for floating point equivalence. Throw an exception + * if not equivalent. + * + * Parameters: + * got - {Object} + * expected - {Object} + * msg - {String} The message to be thrown. This message will be appended + * with ": got {got} but expected {expected}" where got and expected are + * replaced with string representations of the above arguments. + */ + function assertFloatEqual(got, expected, msg) { + var OpenLayers = Test.AnotherWay._g_test_iframe.OpenLayers; + if(got === undefined) { + got = "undefined"; + } else if (got === null) { + got = "null"; + } + if(expected === undefined) { + expected = "undefined"; + } else if (expected === null) { + expected = "null"; + } + if(Math.abs(got - expected) > Math.pow(10, -OpenLayers.Util.DEFAULT_PRECISION)) { + throw msg + ": got '" + got + "' but expected '" + expected + "'"; + } + } + /** * Function assertGeometryEqual * Test two geometries for equivalence. Geometries are considered @@ -58,9 +87,9 @@ if(got instanceof OpenLayers.Geometry.Point) { // compare points - assertEqual(got.x, expected.x, "x mismatch"); - assertEqual(got.y, expected.y, "y mismatch"); - assertEqual(got.z, expected.z, "z mismatch"); + assertFloatEqual(got.x, expected.x, "x mismatch"); + assertFloatEqual(got.y, expected.y, "y mismatch"); + assertFloatEqual(got.z, expected.z, "z mismatch"); } else { // compare components assertEqual( @@ -107,4 +136,4 @@ } } -})(); \ No newline at end of file +})(); diff --git a/tests/Geometry/Rectangle.html b/tests/deprecated/Geometry/Rectangle.html similarity index 95% rename from tests/Geometry/Rectangle.html rename to tests/deprecated/Geometry/Rectangle.html index 41dc95a010..75778e8c18 100644 --- a/tests/Geometry/Rectangle.html +++ b/tests/deprecated/Geometry/Rectangle.html @@ -1,6 +1,7 @@ - + +