From 07114fc8944c0506f2e1bdaa2d039605f7b85ffc Mon Sep 17 00:00:00 2001 From: ahocevar Date: Mon, 23 Apr 2012 10:17:20 -0400 Subject: [PATCH 1/9] Setting opacity on the last child. This is required for IFrame tiles, so we don't set the opacity on the event pane. To make this work with vector layers, the defs node needs to be inserted before the root group element instead of after it. --- lib/OpenLayers/Layer.js | 2 +- lib/OpenLayers/Renderer/SVG.js | 2 +- lib/deprecated.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index 63f0aaab2a..8e3cb58141 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -1286,7 +1286,7 @@ OpenLayers.Layer = OpenLayers.Class({ this.opacity = opacity; var childNodes = this.div.childNodes; for(var i = 0, len = childNodes.length; i < len; ++i) { - var element = childNodes[i].firstChild || childNodes[i]; + var element = childNodes[i].lastChild || childNodes[i]; OpenLayers.Util.modifyDOMElement(element, null, null, null, null, null, null, opacity); } diff --git a/lib/OpenLayers/Renderer/SVG.js b/lib/OpenLayers/Renderer/SVG.js index e65da76a9a..91b5b9e3e5 100644 --- a/lib/OpenLayers/Renderer/SVG.js +++ b/lib/OpenLayers/Renderer/SVG.js @@ -470,7 +470,7 @@ OpenLayers.Renderer.SVG = OpenLayers.Class(OpenLayers.Renderer.Elements, { */ createDefs: function() { var defs = this.nodeFactory(this.container.id + "_defs", "defs"); - this.rendererRoot.appendChild(defs); + this.rendererRoot.insertBefore(defs, this.root); return defs; }, diff --git a/lib/deprecated.js b/lib/deprecated.js index 0cc3c1b6aa..face85c114 100644 --- a/lib/deprecated.js +++ b/lib/deprecated.js @@ -5256,7 +5256,7 @@ OpenLayers.Renderer.SVG2 = OpenLayers.Class(OpenLayers.Renderer.NG, { */ createDefs: function() { var defs = this.nodeFactory(this.container.id + "_defs", "defs"); - this.rendererRoot.appendChild(defs); + this.rendererRoot.insertBefore(defs, this.root); return defs; }, From 11cc960be5e5961599c5cc9012f3bc37f9220ba7 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Mon, 23 Apr 2012 10:36:51 -0400 Subject: [PATCH 2/9] Setting opacity on the IFrame's parent, like we used to do in 2.11. --- lib/OpenLayers/Layer.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index 8e3cb58141..e29e95b43f 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -1287,6 +1287,11 @@ OpenLayers.Layer = OpenLayers.Class({ var childNodes = this.div.childNodes; for(var i = 0, len = childNodes.length; i < len; ++i) { var element = childNodes[i].lastChild || childNodes[i]; + if (element.nodeName.toLowerCase() === "iframe") { + // changing opacity on IFrame elements does not work, so + // we set it on the parent + element = element.parentNode; + } OpenLayers.Util.modifyDOMElement(element, null, null, null, null, null, null, opacity); } From c6c1bf1f774a68202ac0ce16dfe8a46e5e30f496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Mon, 23 Apr 2012 23:57:48 +0200 Subject: [PATCH 3/9] fix movestart, move, moveend sequence on pan with animate:false --- lib/OpenLayers/Map.js | 6 ++++-- tests/Map.html | 31 ++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/lib/OpenLayers/Map.js b/lib/OpenLayers/Map.js index bde8169ede..ba727f5189 100644 --- a/lib/OpenLayers/Map.js +++ b/lib/OpenLayers/Map.js @@ -1634,8 +1634,10 @@ OpenLayers.Map = OpenLayers.Class({ this.panTo(newCenterLonLat); } else { this.moveTo(newCenterLonLat); - this.dragging = false; - this.events.triggerEvent("moveend"); + if(this.dragging) { + this.dragging = false; + this.events.triggerEvent("moveend"); + } } } } diff --git a/tests/Map.html b/tests/Map.html index a6bed80e31..860ba3360a 100644 --- a/tests/Map.html +++ b/tests/Map.html @@ -1712,7 +1712,36 @@ t.eq(log[1], "move", "followed by move,"); t.eq(log[log.length-2], "move", "move again before we stop panning,"); t.eq(log[log.length-1], "moveend", "and moveend when we're done."); - + } + + function test_pan_no_anim_event_sequence(t) { + t.plan(4); + + var log = []; + var map = new OpenLayers.Map("map"); + map.addLayer( + new OpenLayers.Layer(null, {isBaseLayer: true}) + ); + map.setCenter(new OpenLayers.LonLat(0, 0), 5); + map.events.on({ + "movestart": function() { + log.push("movestart"); + }, + "move": function() { + log.push("move"); + }, + "moveend": function() { + log.push("moveend"); + } + }); + + map.pan(5,5, {animate: false}); + t.eq(log.length, 3, "no more than 3 events happen."); + t.eq(log[0], "movestart", "pan sequence starts with movestart"); + t.eq(log[1], "move", "followed by move,"); + t.eq(log[2], "moveend", "and moveend when we're done."); + + map.destroy(); } // test if we can call updateSize before document.body is ready. updateOk From a57c56ed967cb62cc34927392a93ce12d0b53f8e Mon Sep 17 00:00:00 2001 From: ahocevar Date: Mon, 23 Apr 2012 18:03:39 -0400 Subject: [PATCH 4/9] Revert "Merge pull request #432 from ahocevar/iframe-opacity" This reverts commit af046b9af80ec3467a431f9d3dc0fbf606a2769a, reversing changes made to f36fd5f0d18d45e2654f0ffe48598d94b63c7526. The reason for reverting this is that the change breaks the select-feature-multilayer.html example. --- lib/OpenLayers/Layer.js | 7 +------ lib/OpenLayers/Renderer/SVG.js | 2 +- lib/deprecated.js | 2 +- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index e29e95b43f..63f0aaab2a 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -1286,12 +1286,7 @@ OpenLayers.Layer = OpenLayers.Class({ this.opacity = opacity; var childNodes = this.div.childNodes; for(var i = 0, len = childNodes.length; i < len; ++i) { - var element = childNodes[i].lastChild || childNodes[i]; - if (element.nodeName.toLowerCase() === "iframe") { - // changing opacity on IFrame elements does not work, so - // we set it on the parent - element = element.parentNode; - } + var element = childNodes[i].firstChild || childNodes[i]; OpenLayers.Util.modifyDOMElement(element, null, null, null, null, null, null, opacity); } diff --git a/lib/OpenLayers/Renderer/SVG.js b/lib/OpenLayers/Renderer/SVG.js index 91b5b9e3e5..e65da76a9a 100644 --- a/lib/OpenLayers/Renderer/SVG.js +++ b/lib/OpenLayers/Renderer/SVG.js @@ -470,7 +470,7 @@ OpenLayers.Renderer.SVG = OpenLayers.Class(OpenLayers.Renderer.Elements, { */ createDefs: function() { var defs = this.nodeFactory(this.container.id + "_defs", "defs"); - this.rendererRoot.insertBefore(defs, this.root); + this.rendererRoot.appendChild(defs); return defs; }, diff --git a/lib/deprecated.js b/lib/deprecated.js index face85c114..0cc3c1b6aa 100644 --- a/lib/deprecated.js +++ b/lib/deprecated.js @@ -5256,7 +5256,7 @@ OpenLayers.Renderer.SVG2 = OpenLayers.Class(OpenLayers.Renderer.NG, { */ createDefs: function() { var defs = this.nodeFactory(this.container.id + "_defs", "defs"); - this.rendererRoot.insertBefore(defs, this.root); + this.rendererRoot.appendChild(defs); return defs; }, From 179433da2f05afb07130103ba3a50f6d246b9532 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Mon, 23 Apr 2012 18:46:28 -0400 Subject: [PATCH 5/9] For IFrame tiles, we need to set opacity on the IFrame's parent. --- lib/OpenLayers/Layer.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/OpenLayers/Layer.js b/lib/OpenLayers/Layer.js index 63f0aaab2a..73ce4e8024 100644 --- a/lib/OpenLayers/Layer.js +++ b/lib/OpenLayers/Layer.js @@ -1287,6 +1287,11 @@ OpenLayers.Layer = OpenLayers.Class({ var childNodes = this.div.childNodes; for(var i = 0, len = childNodes.length; i < len; ++i) { var element = childNodes[i].firstChild || childNodes[i]; + var lastChild = childNodes[i].lastChild; + //TODO de-uglify this + if (lastChild && lastChild.nodeName.toLowerCase() === "iframe") { + element = lastChild.parentNode; + } OpenLayers.Util.modifyDOMElement(element, null, null, null, null, null, null, opacity); } From fc0b15ad45a1f6c23d9ae10c8149242adb84c894 Mon Sep 17 00:00:00 2001 From: ahocevar Date: Tue, 24 Apr 2012 08:06:40 -0400 Subject: [PATCH 6/9] Overriding onImageLoad to set the opacity on the correct element. --- lib/OpenLayers/Tile/Image/IFrame.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/OpenLayers/Tile/Image/IFrame.js b/lib/OpenLayers/Tile/Image/IFrame.js index 6a5a369598..f3e408e78a 100644 --- a/lib/OpenLayers/Tile/Image/IFrame.js +++ b/lib/OpenLayers/Tile/Image/IFrame.js @@ -196,6 +196,19 @@ OpenLayers.Tile.Image.IFrame = { OpenLayers.Tile.Image.prototype.setImgSrc.apply(this, arguments); } }, + + /** + * Method: onImageLoad + * Handler for the image onload event + */ + onImageLoad: function() { + //TODO de-uglify opacity handling + OpenLayers.Tile.Image.prototype.onImageLoad.apply(this, arguments); + if (this.useIFrame === true) { + this.imgDiv.style.opacity = 1; + this.frame.style.opacity = this.layer.opacity; + } + }, /** * Method: createBackBuffer From 1ace4df160b233fcab607cbaa1e5b7cdf2003b39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Tue, 24 Apr 2012 21:55:49 +0200 Subject: [PATCH 7/9] set OpenLayers.VERSION_NUMBER to Release 2.12-rc2 --- lib/OpenLayers.js | 2 +- lib/OpenLayers/SingleFile.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/OpenLayers.js b/lib/OpenLayers.js index 4bc58976c9..f6df5e1915 100644 --- a/lib/OpenLayers.js +++ b/lib/OpenLayers.js @@ -414,4 +414,4 @@ /** * Constant: VERSION_NUMBER */ -OpenLayers.VERSION_NUMBER="Release 2.12-rc1"; +OpenLayers.VERSION_NUMBER="Release 2.12-rc2"; diff --git a/lib/OpenLayers/SingleFile.js b/lib/OpenLayers/SingleFile.js index 6bd4cb8e0f..5ea5ae5a31 100644 --- a/lib/OpenLayers/SingleFile.js +++ b/lib/OpenLayers/SingleFile.js @@ -7,7 +7,7 @@ var OpenLayers = { /** * Constant: VERSION_NUMBER */ - VERSION_NUMBER: "Release 2.12-rc1", + VERSION_NUMBER: "Release 2.12-rc2", /** * Constant: singleFile From 5f1651a30f148ab2cfee861a7c6dfe109b7014cd Mon Sep 17 00:00:00 2001 From: Frederic Junod Date: Wed, 25 Apr 2012 10:33:35 +0200 Subject: [PATCH 8/9] Add missing hover option to the SelectFeature control. Thanks Arnie Shore. --- examples/light-basic.js | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/light-basic.js b/examples/light-basic.js index 15381f460b..89465bede4 100644 --- a/examples/light-basic.js +++ b/examples/light-basic.js @@ -57,6 +57,7 @@ function init() { // create the select feature control var selector = new OpenLayers.Control.SelectFeature(vector,{ + hover:true, autoActivate:true }); From 612401a644f0736dfaddb2b475598eb4ad5038a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Fri, 27 Apr 2012 23:28:32 +0200 Subject: [PATCH 9/9] fix bug where tiles with gutters are shifted (refs #441) --- lib/OpenLayers/Tile/Image.js | 16 ++++--- tests/Tile/Image.html | 91 ++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 6 deletions(-) diff --git a/lib/OpenLayers/Tile/Image.js b/lib/OpenLayers/Tile/Image.js index 149831ef35..50c2548202 100644 --- a/lib/OpenLayers/Tile/Image.js +++ b/lib/OpenLayers/Tile/Image.js @@ -211,7 +211,8 @@ OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile, { */ positionTile: function() { var style = this.getTile().style, - size = this.layer.getImageSize(this.bounds); + size = this.frame ? this.size : + this.layer.getImageSize(this.bounds); style.left = this.position.x + "%"; style.top = this.position.y + "%"; style.width = size.w + "%"; @@ -254,11 +255,16 @@ OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile, { this.imgDiv.galleryImg = "no"; var style = this.imgDiv.style; - if (this.layer.gutter) { - var left = this.layer.gutter / this.layer.tileSize.w * 100; - var top = this.layer.gutter / this.layer.tileSize.h * 100; + if (this.frame) { + var left = 0, top = 0; + if (this.layer.gutter) { + left = this.layer.gutter / this.layer.tileSize.w * 100; + top = this.layer.gutter / this.layer.tileSize.h * 100; + } style.left = -left + "%"; style.top = -top + "%"; + style.width = (2 * left + 100) + "%"; + style.height = (2 * top + 100) + "%"; } style.visibility = "hidden"; style.opacity = 0; @@ -275,8 +281,6 @@ OpenLayers.Tile.Image = OpenLayers.Class(OpenLayers.Tile, { style.width = "100%"; } if (this.frame) { - style.width = "100%"; - style.height = "100%"; this.frame.appendChild(this.imgDiv); } } diff --git a/tests/Tile/Image.html b/tests/Tile/Image.html index 6ef426e386..2623dd5a6a 100644 --- a/tests/Tile/Image.html +++ b/tests/Tile/Image.html @@ -399,6 +399,97 @@ } } + /* + * A series of tests to verify the dimensions and positions + * of the tile frame and img after draw. + + * Written for https://github.com/openlayers/openlayers/issues/441 + */ + function test_draw_without_gutter_without_frame(t) { + t.plan(5); + + var map = new OpenLayers.Map('map'); + var layer = new OpenLayers.Layer.WMS('blank', + '../../img/blank.gif', + {layers: 'fake'}, + {isBaseLayer: true}); + map.addLayer(layer); + var tile = new OpenLayers.Tile.Image( + layer, + new OpenLayers.Pixel(6, 6), + new OpenLayers.Bounds(5, 45, 6, 46), + null, + new OpenLayers.Size(256, 256)); + + tile.draw(); + t.eq(tile.frame, null, 'no frame'); + t.eq(parseInt(tile.imgDiv.style.left, 10), 6, 'correct tile img left'); + t.eq(parseInt(tile.imgDiv.style.top, 10), 6, 'correct tile img top'); + t.eq(parseInt(tile.imgDiv.style.width, 10), 256, 'correct tile img width'); + t.eq(parseInt(tile.imgDiv.style.height, 10), 256, 'correct tile img height'); + + map.destroy(); + } + function test_draw_without_gutter_with_frame(t) { + t.plan(8); + + var map = new OpenLayers.Map('map'); + var layer = new OpenLayers.Layer.WMS('blank', + '../../img/blank.gif', + {layers: 'fake'}, + {isBaseLayer: true}); + map.addLayer(layer); + layer.gutter = 1; // this is just for a frame to be created for + // the tile + var tile = new OpenLayers.Tile.Image( + layer, + new OpenLayers.Pixel(6, 6), + new OpenLayers.Bounds(5, 45, 6, 46), + null, + new OpenLayers.Size(256, 256)); + layer.gutter = null; + + tile.draw(); + t.eq(parseInt(tile.frame.style.left, 10), 6, 'correct tile frame left'); + t.eq(parseInt(tile.frame.style.top, 10), 6, 'correct tile frame top'); + t.eq(parseInt(tile.frame.style.width, 10), 256, 'correct tile frame width'); + t.eq(parseInt(tile.frame.style.height, 10), 256, 'correct tile frame height'); + t.eq(parseInt(tile.imgDiv.style.left, 10), 0, 'correct tile img left'); + t.eq(parseInt(tile.imgDiv.style.top, 10), 0, 'correct tile img top'); + t.eq(parseInt(tile.imgDiv.style.width, 10), 100, 'correct tile img width'); + t.eq(parseInt(tile.imgDiv.style.height, 10), 100, 'correct tile img height'); + + map.destroy(); + } + function test_draw_with_gutter(t) { + t.plan(8); + + var map = new OpenLayers.Map('map'); + var layer = new OpenLayers.Layer.WMS('blank', + '../../img/blank.gif', + {layers: 'fake'}, + {isBaseLayer: true, gutter: 15}); + map.addLayer(layer); + var tile = new OpenLayers.Tile.Image( + layer, + new OpenLayers.Pixel(6, 6), + new OpenLayers.Bounds(5, 45, 6, 46), + null, + new OpenLayers.Size(256, 256)); + + tile.draw(); + t.eq(parseInt(tile.frame.style.left, 10), 6, 'correct tile frame left'); + t.eq(parseInt(tile.frame.style.top, 10), 6, 'correct tile frame top'); + t.eq(parseInt(tile.frame.style.width, 10), 256, 'correct tile frame width'); + t.eq(parseInt(tile.frame.style.height, 10), 256, 'correct tile frame height'); + t.eq(parseInt(tile.imgDiv.style.left, 10), -5, 'correct tile img left'); + t.eq(parseInt(tile.imgDiv.style.top, 10), -5, 'correct tile img top'); + t.eq(parseInt(tile.imgDiv.style.width, 10), 111, 'correct tile img width'); + t.eq(parseInt(tile.imgDiv.style.height, 10), 111, 'correct tile img height'); + + map.destroy(); + } +