GUI -- Augmented pan/zoom & select/drag integration by having a toggle button for whether meta needs to be pressed for panning (default) or selecting.
 - multi-select requires the shift key to be held down.
 - Also re-wired deselectAll() to the ESC key, instead of click on background.

Change-Id: I63502839368c6ca10c64ee583a58f836576c4546
diff --git a/web/gui/src/main/webapp/d3Utils.js b/web/gui/src/main/webapp/d3Utils.js
index e647a37..90b3032 100644
--- a/web/gui/src/main/webapp/d3Utils.js
+++ b/web/gui/src/main/webapp/d3Utils.js
@@ -37,6 +37,9 @@
         if (!$.isFunction(atDragEnd)) {
             alert('d3util.createDragBehavior(): atDragEnd is not a function')
         }
+        if (!$.isFunction(requireMeta)) {
+            alert('d3util.createDragBehavior(): requireMeta is not a function')
+        }
 
         function dragged(d) {
             var threshold = draggedThreshold(force.alpha()),
@@ -51,7 +54,7 @@
         drag = d3.behavior.drag()
             .origin(function(d) { return d; })
             .on('dragstart', function(d) {
-                if (requireMeta ^ !d3.event.sourceEvent.metaKey) {
+                if (requireMeta() ^ !d3.event.sourceEvent.metaKey) {
                     d3.event.sourceEvent.stopPropagation();
 
                     d.oldX = d.x;
@@ -62,7 +65,7 @@
                 }
             })
             .on('drag', function(d) {
-                if (requireMeta ^ !d3.event.sourceEvent.metaKey) {
+                if (requireMeta() ^ !d3.event.sourceEvent.metaKey) {
                     d.px = d3.event.x;
                     d.py = d3.event.y;
                     if (dragged(d)) {