ONOS-1419 - Fix to allow nodes to be selected in the Oblique View.
(NOTE: still experimental feature, but it works sufficiently)

Change-Id: I4437180a9c34656effa0735288818ea0a05779ac
diff --git a/web/gui/src/main/webapp/app/view/topo/topoLink.js b/web/gui/src/main/webapp/app/view/topo/topoLink.js
index ec4cc53..9cd49dc 100644
--- a/web/gui/src/main/webapp/app/view/topo/topoLink.js
+++ b/web/gui/src/main/webapp/app/view/topo/topoLink.js
@@ -48,16 +48,47 @@
         return {x: mx, y: my};
     }
 
-    function computeNearestLink(mouse) {
-        var proximity = 30 / api.zoomer.scale(),
+
+    function sq(x) { return x * x; }
+
+    function mdist(p, m) {
+        return Math.sqrt(sq(p.x - m.x) + sq(p.y - m.y));
+    }
+
+    function prox(dist) {
+        return dist / api.zoomer.scale();
+    }
+
+    function computeNearestNode(mouse) {
+        var proximity = prox(30),
             nearest = null,
             minDist;
 
-        function sq(x) { return x * x; }
+        if (network.nodes.length) {
+            minDist = proximity * 2;
 
-        function mdist(p, m) {
-            return Math.sqrt(sq(p.x - m.x) + sq(p.y - m.y));
+            network.nodes.forEach(function (d) {
+                var dist;
+
+                if (!api.showHosts() && d.class === 'host') {
+                    return; // skip hidden hosts
+                }
+
+                dist = mdist({x: d.x, y: d.y}, mouse);
+                if (dist < minDist && dist < proximity) {
+                    minDist = dist;
+                    nearest = d;
+                }
+            });
         }
+        return nearest;
+    }
+
+
+    function computeNearestLink(mouse) {
+        var proximity = prox(30),
+            nearest = null,
+            minDist;
 
         function pdrop(line, mouse) {
             var x1 = line.x1,
@@ -229,12 +260,18 @@
     }
 
     function mouseClickHandler() {
-        var mp, link;
+        var mp, link, node;
 
         if (!tss.clickConsumed()) {
             mp = getLogicalMousePosition(this);
-            link = computeNearestLink(mp);
-            selectLink(link);
+            node = computeNearestNode(mp);
+            if (node) {
+                $log.debug('found nearest node:', node.labels[1]);
+                tss.selectObject(node);
+            } else {
+                link = computeNearestLink(mp);
+                selectLink(link);
+            }
         }
     }
 
diff --git a/web/gui/src/main/webapp/app/view/topo/topoSelect.js b/web/gui/src/main/webapp/app/view/topo/topoSelect.js
index b8153c3..880ab90 100644
--- a/web/gui/src/main/webapp/app/view/topo/topoSelect.js
+++ b/web/gui/src/main/webapp/app/view/topo/topoSelect.js
@@ -88,14 +88,15 @@
 
     function selectObject(obj) {
         var el = this,
-            ev = d3.event.sourceEvent,
+            nodeEv = el && el.tagName === 'g',
+            ev = d3.event.sourceEvent || {},
             n;
 
         if (api.zoomingOrPanning(ev)) {
             return;
         }
 
-        if (el) {
+        if (nodeEv) {
             n = d3.select(el);
         } else {
             api.node().each(function (d) {
@@ -106,7 +107,9 @@
         }
         if (!n) return;
 
-        consumeClick = true;
+        if (nodeEv) {
+            consumeClick = true;
+        }
         api.deselectLink();
 
         if (ev.shiftKey && n.classed('selected')) {