summaryrefslogtreecommitdiff
path: root/src/client/view/selection.js
diff options
context:
space:
mode:
authorAlon Levy <alon@pobox.com>2014-12-16 17:37:42 +0200
committerAlon Levy <alon@pobox.com>2014-12-16 17:37:42 +0200
commitade19de410e0a789a921ec1666b278b2a64176d6 (patch)
treec4c54b106de93609ca7bb70a20fd4be696715dbe /src/client/view/selection.js
parentc7d026b1d504323a8c61d51b726e5e8d2337fc4b (diff)
moving files around after repository merger
Diffstat (limited to 'src/client/view/selection.js')
-rw-r--r--src/client/view/selection.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/client/view/selection.js b/src/client/view/selection.js
new file mode 100644
index 00000000..d51d1a4b
--- /dev/null
+++ b/src/client/view/selection.js
@@ -0,0 +1,102 @@
+define(['rz_core'],
+function(rz_core) {
+
+function get_rz_core()
+{
+ // circular dependency on rz_core, so require.js cannot solve it.
+ if (rz_core === undefined) {
+ rz_core = require('rz_core');
+ }
+ return rz_core;
+}
+
+var selected_nodes = [];
+
+function byVisitors(node_selector, link_selector) {
+ var new_selected_nodes = get_rz_core().graph.findByVisitors(node_selector, link_selector);
+
+ clear();
+ connectedComponent(new_selected_nodes);
+}
+
+function connectedComponent(nodes) {
+ var connected = get_rz_core().graph.getConnectedNodesAndLinks(nodes, 1),
+ i,
+ node,
+ link,
+ data;
+
+ selected_nodes = nodes.map(function(x) { return x; });
+
+ for (i = 0 ; i < connected.nodes.length ; ++i) {
+ data = connected.nodes[i];
+ node = data.node;
+ switch (data.type) {
+ case 'exit':
+ node.state = 'exit';
+ break;
+ case 'enter':
+ node.state = 'enter';
+ break;
+ };
+ }
+ for (i = 0 ; i < connected.links.length ; ++i) {
+ data = connected.links[i];
+ link = data.link;
+ switch (data.type) {
+ case 'exit':
+ link.state = 'exit';
+ break;
+ case 'enter':
+ link.state = 'enter';
+ break;
+ };
+ }
+ nodes.forEach(function (n) { n.state = 'chosen'; });
+}
+
+var node_selected = function(node) {
+ return node.state == 'chosen' || node.state == 'enter' || node.state == 'exit' || node.state == 'selected'
+ || node.state == 'temp' || node.state == 'related';
+}
+
+var selected_class = function(node) {
+ return selected_nodes.length > 0 ? (node_selected(node) ? "selected" : "notselected") : "";
+}
+
+var clear = function() {
+ selected_nodes.length = 0;
+ get_rz_core().graph.setRegularState();
+}
+
+function arr_compare(a1, a2)
+{
+ if (a1.length != a2.length) {
+ return false;
+ }
+ for (var i = 0 ; i < a1.length ; ++i) {
+ if (a1[i] != a2[i]) {
+ return false;
+ }
+ }
+ return true;
+}
+
+var update = function(nodes) {
+ var set = !arr_compare(nodes, selected_nodes);
+ clear();
+ if (set) {
+ connectedComponent(nodes);
+ }
+}
+
+return {
+ byVisitors: byVisitors,
+ connectedComponent: connectedComponent,
+ clear: clear,
+ update: update,
+ selected_class: selected_class,
+ node_selected: node_selected,
+};
+
+});