diff --git a/lib/OpenLayers/Tile.js b/lib/OpenLayers/Tile.js index 469615dfc5..ea16fb71ea 100644 --- a/lib/OpenLayers/Tile.js +++ b/lib/OpenLayers/Tile.js @@ -119,6 +119,30 @@ OpenLayers.Tile = OpenLayers.Class({ this.events.destroy(); this.events = null; }, + + /** + * Method: clone + * + * Parameters: + * obj - {} The tile to be cloned + * + * Returns: + * {} An exact clone of this + */ + clone: function (obj) { + if (obj == null) { + obj = new OpenLayers.Tile(this.layer, + this.position, + this.bounds, + this.url, + this.size); + } + + // catch any randomly tagged-on properties + OpenLayers.Util.applyDefaults(obj, this); + + return obj; + }, /** * Method: draw diff --git a/lib/OpenLayers/Tile/Image.js b/lib/OpenLayers/Tile/Image.js index 566bcbbc12..33cefcf028 100644 --- a/lib/OpenLayers/Tile/Image.js +++ b/lib/OpenLayers/Tile/Image.js @@ -91,6 +91,34 @@ OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile, { OpenLayers.Tile.prototype.destroy.apply(this, arguments); }, + /** + * Method: clone + * + * Parameters: + * obj - {} The tile to be cloned + * + * Returns: + * {} An exact clone of this + */ + clone: function (obj) { + if (obj == null) { + obj = new OpenLayers.Tile.Image(this.layer, + this.position, + this.bounds, + this.url, + this.size); + } + + //pick up properties from superclass + obj = OpenLayers.Tile.prototype.clone.apply(this, [obj]); + + //dont want to directly copy the image div + obj.imgDiv = null; + + + return obj; + }, + /** * Method: draw * Check that a tile should be drawn, and draw it. diff --git a/tests/Tile/test_Image.html b/tests/Tile/test_Image.html index 17bed356b0..e3b270ca48 100644 --- a/tests/Tile/test_Image.html +++ b/tests/Tile/test_Image.html @@ -24,7 +24,33 @@ t.eq( tile.url, url, "tile.url is set correctly"); t.ok( tile.size.equals(size), "tile.size is set correctly"); } - function test_02_Tile_Image_draw (t) { + + function test_02_Tile_Image_clone (t) { + t.plan( 9 ); + + var layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", + "http://labs.metacarta.com/wms/vmap0?", {layers: 'basic'}); + + var position = new OpenLayers.Pixel(20,30); + var bounds = new OpenLayers.Bounds(1,2,3,4); + var url = "http://www.openlayers.org/dev/tests/tileimage"; + var size = new OpenLayers.Size(5,6); + tile = new OpenLayers.Tile.Image(layer, position, bounds, url, size); + tile.imgDiv = {}; + var clone = tile.clone(); + + t.ok( clone instanceof OpenLayers.Tile.Image, "OpenLayers.Tile.clone returns Tile.Image object" ); + t.ok( clone.layer == layer, "clone.layer is set correctly"); + t.ok( clone.position.equals(position), "clone.position is set correctly"); + t.ok( clone.bounds.equals(bounds), "clone.bounds is set correctly"); + t.eq( clone.url, url, "clone.url is set correctly"); + t.ok( clone.size.equals(size), "clone.size is set correctly"); + t.ok( clone.frame, "clone has a frame"); + t.ok( clone.frame != tile.frame, "clone's frame is a new one"); + t.ok( clone.imgDiv == null, "clone's imgDiv was not copied"); + } + + function test_03_Tile_Image_draw (t) { t.plan( 7 ); var map = new OpenLayers.Map('map'); @@ -78,7 +104,7 @@ tile.draw(); } - function test_03_Tile_Image_OutsideMaxExtent(t) { + function test_04_Tile_Image_OutsideMaxExtent(t) { t.plan( 11 ); var position = new OpenLayers.Pixel(20,30); var bounds = new OpenLayers.Bounds(1,2,3,4); @@ -160,7 +186,7 @@ "http://labs.metacarta.com/wms/vmap0?" + OpenLayers.Util.getParameterString(tParams), "Image covering more than all of extent loads"); } - function test_04_Tile_Image_Display_After_Move(t) { + function test_05_Tile_Image_Display_After_Move(t) { t.plan(2); var position = new OpenLayers.Pixel(20,30); var bounds = new OpenLayers.Bounds(1,2,3,4); @@ -185,7 +211,7 @@ } - function test_05_Tile_Image_gutters(t) { + function test_06_Tile_Image_gutters(t) { t.plan(5); var gutter = 0; diff --git a/tests/test_Tile.html b/tests/test_Tile.html index 094edcd6a7..1b10088115 100644 --- a/tests/test_Tile.html +++ b/tests/test_Tile.html @@ -31,6 +31,32 @@ t.ok( tile.events != null, "tile's events intitialized"); } + function test_02_Tile_clone (t) { + t.plan( 10 ); + + var layer = {}; // bogus layer + var position = new OpenLayers.Pixel(10,20); + var bounds = new OpenLayers.Bounds(1,2,3,4); + var url = "bobob"; + var size = new OpenLayers.Size(5,6); + + tile = new OpenLayers.Tile(layer, position, bounds, url, size); + var clone = tile.clone(); + + t.ok( clone instanceof OpenLayers.Tile, "OpenLayers.Tile.clone returns Tile object" ); + t.eq( clone.layer, layer, "clone.layer set correctly"); + t.ok( clone.position.equals(position), "clone.position set correctly"); + t.ok( clone.bounds.equals(bounds), "clone.bounds set correctly"); + t.eq( clone.url, url, "clone.url set correctly"); + t.ok( clone.size.equals(size), "clone.size is set correctly" ); + + t.ok( clone.id != null, "clone is given an id"); + t.ok( clone.id != tile.id, "clone is given a new id"); + t.ok(OpenLayers.String.startsWith(clone.id, "Tile_"), + "clone's id starts correctly"); + t.ok( clone.events != null, "clone's events intitialized"); + } + function test_99_Tile_destroy(t) { t.plan( 6 );