From df404a6eaf38cca0a2b78213b1323f73deba3b1c Mon Sep 17 00:00:00 2001
From: juanf <juanf>
Date: Tue, 4 Mar 2014 10:50:31 +0000
Subject: [PATCH] BIS-604 / SP-1211: ELN UI - Hierarchical View (Zoom and Pan
 Controls Polishment)

SVN: 30806
---
 .../html/js/views/SampleHierarchy.js          | 63 +++++++++++--------
 1 file changed, 37 insertions(+), 26 deletions(-)

diff --git a/plasmid/source/core-plugins/newbrowser/1/as/webapps/newbrowser/html/js/views/SampleHierarchy.js b/plasmid/source/core-plugins/newbrowser/1/as/webapps/newbrowser/html/js/views/SampleHierarchy.js
index 2c0313eabd8..e6cbb492052 100644
--- a/plasmid/source/core-plugins/newbrowser/1/as/webapps/newbrowser/html/js/views/SampleHierarchy.js
+++ b/plasmid/source/core-plugins/newbrowser/1/as/webapps/newbrowser/html/js/views/SampleHierarchy.js
@@ -437,11 +437,7 @@ function SampleHierarchy(serverFacade, inspector, containerId, profile, sample)
 			.attr('width', $(document).width() - 30)
 			.attr('height', $(document).height() - 120)
 		
-		d3.select('#svgMapContainer')
-		.call(d3.behavior.zoom().on('zoom', function() {
-			var ev = d3.event;
-			svgG.attr('transform', 'translate(' + ev.translate + ') scale(' + ev.scale + ')');
-		})).on("dblclick.zoom", null);
+		d3.select('#svgMapContainer').call(zoomFunc);
 	}
 	
 	this._makeSVG = function(tag, attrs) {
@@ -452,33 +448,48 @@ function SampleHierarchy(serverFacade, inspector, containerId, profile, sample)
     }
 	
 	//
-	// Zoom and Pan controls
+	// Zoom and Pan API (Can be used externaly)
 	//
+	
     this.pan = function(dx, dy)
     {
-    	var svgTransform = d3.select('#svgMap').attr("transform");
-		
-		var svgTransformTranslate  = /translate\(\s*([^\s,)]+)[ ,]([^\s,)]+)/.exec(svgTransform);
-		var translateX = parseFloat(svgTransformTranslate[1]) + dx;
-		var translateY = parseFloat(svgTransformTranslate[2]) + dy;
-		
-		var svgTransformScale  = /scale\(([^\s,)]+)/.exec(svgTransform);
-		var scaleRatio = parseFloat(svgTransformScale[1]);
-		
-		d3.select('#svgMap').attr('transform', 'translate(' + translateX + ',' + translateY + ') scale(' + scaleRatio + ')');
+		var newTranslate = [projection.translate[0] + dx, projection.translate[1] + dy];
+		zoomFunc.translate(newTranslate);
+		projection.translate = newTranslate;
+		d3.select('#svgMap').attr('transform', 'translate(' + newTranslate + ') scale(' + projection.scale + ')');
     }
     
 	this.zoom = function(scale)
 	{
-		var svgTransform = d3.select('#svgMap').attr("transform");
-		
-		var svgTransformTranslate  = /translate\(\s*([^\s,)]+)[ ,]([^\s,)]+)/.exec(svgTransform);
-		var translateX = parseFloat(svgTransformTranslate[1]);
-		var translateY = parseFloat(svgTransformTranslate[2]);
-		
-		var svgTransformScale  = /scale\(([^\s,)]+)/.exec(svgTransform);
-		var scaleRatio = parseFloat(svgTransformScale[1]) * scale;
-		
-		d3.select('#svgMap').attr('transform', 'translate(' + translateX + ',' + translateY + ') scale(' + scaleRatio + ')');
+		var newScale = projection.scale * scale;
+		zoomFunc.scale(newScale);
+		projection.scale = newScale;
+		d3.select('#svgMap').attr('transform', 'translate(' + projection.translate + ') scale(' + newScale + ')');
     }
+	
+	//
+	// Zoom and Pan Internals (To keep in sync internal D3 projection of the translate and scale properties with the DOM ones)
+	//
+	var projection = {
+			scale : 1,
+			translate : [20, 20]
+	};
+	
+	var zoomFunc = d3.behavior.zoom()
+		.translate(projection.translate)
+		.scale(projection.scale)
+		.on("zoom", move);
+	
+	function move() {
+		  var t = d3.event.translate,
+		      s = d3.event.scale;
+		  
+		  zoomFunc.translate(t);
+		  zoomFunc.scale(s);
+		  
+		  projection.translate = t; 
+		  projection.scale = s;
+		  
+		  d3.select('#svgMap').attr('transform', 'translate(' + t + ') scale(' + s + ')');
+	}
 }
-- 
GitLab