Index: tools/turbolizer/selection-broker.js |
diff --git a/tools/turbolizer/selection-broker.js b/tools/turbolizer/selection-broker.js |
index 3a223d8b643097079d68b543eadc741e797c7977..822cf1ce1f62fd74b7874fd7e76e3323d40c9ac4 100644 |
--- a/tools/turbolizer/selection-broker.js |
+++ b/tools/turbolizer/selection-broker.js |
@@ -6,25 +6,78 @@ var SelectionBroker = function() { |
this.brokers = []; |
this.dispatching = false; |
this.lastDispatchingHandler = null; |
+ this.nodePositionMap = []; |
+ this.sortedPositionList = []; |
+ this.positionNodeMap = []; |
}; |
SelectionBroker.prototype.addSelectionHandler = function(handler) { |
this.brokers.push(handler); |
} |
-SelectionBroker.prototype.select = function(from, ranges, selected) { |
- if (!this.dispatching) { |
- this.lastDispatchingHandler = from; |
+SelectionBroker.prototype.setNodePositionMap = function(map) { |
+ let broker = this; |
+ if (!map) return; |
+ broker.nodePositionMap = map; |
+ broker.positionNodeMap = []; |
+ broker.sortedPositionList = []; |
+ let next = 0; |
+ for (let i in broker.nodePositionMap) { |
+ broker.sortedPositionList[next] = Number(broker.nodePositionMap[i]); |
+ broker.positionNodeMap[next++] = i; |
+ } |
+ broker.sortedPositionList = sortUnique(broker.sortedPositionList, |
+ function(a,b) { return a - b; }); |
+ this.positionNodeMap.sort(function(a,b) { |
+ let result = broker.nodePositionMap[a] - broker.nodePositionMap[b]; |
+ if (result != 0) return result; |
+ return a - b; |
+ }); |
+} |
+ |
+SelectionBroker.prototype.select = function(from, locations, selected) { |
+ let broker = this; |
+ if (!broker.dispatching) { |
+ broker.lastDispatchingHandler = from; |
try { |
- this.dispatching = true; |
+ broker.dispatching = true; |
+ let enrichLocations = function(locations) { |
+ result = []; |
+ for (let location of locations) { |
+ let newLocation = {}; |
+ if (location.pos_start != undefined) { |
+ newLocation.pos_start = location.pos_start; |
+ } |
+ if (location.pos_end != undefined) { |
+ newLocation.pos_end = location.pos_end; |
+ } |
+ if (location.node_id != undefined) { |
+ newLocation.node_id = location.node_id; |
+ } |
+ if (location.block_id != undefined) { |
+ newLocation.block_id = location.block_id; |
+ } |
+ if (newLocation.pos_start == undefined && |
+ newLocation.pos_end == undefined && |
+ newLocation.node_id != undefined) { |
+ if (broker.nodePositionMap && broker.nodePositionMap[location.node_id]) { |
+ newLocation.pos_start = broker.nodePositionMap[location.node_id]; |
+ newLocation.pos_end = location.pos_start + 1; |
+ } |
+ } |
+ result.push(newLocation); |
+ } |
+ return result; |
+ } |
+ locations = enrichLocations(locations); |
for (var b of this.brokers) { |
if (b != from) { |
- b.brokeredSelect(ranges, selected); |
+ b.brokeredSelect(locations, selected); |
} |
} |
} |
finally { |
- this.dispatching = false; |
+ broker.dispatching = false; |
} |
} |
} |