d3905561b9
Also convert CodeView to a class and fix a host of selection bugs in the process, as well as move the logic and data to "enrich" location with one type of location data with location data known globally to the whole graph in the selection broker. Review-Url: https://codereview.chromium.org/2230083004 Cr-Commit-Position: refs/heads/master@{#38544}
109 lines
2.9 KiB
JavaScript
109 lines
2.9 KiB
JavaScript
// Copyright 2015 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
var Selection = function(handler) {
|
|
this.handler = handler;
|
|
this.selectionBase = null;
|
|
this.lastSelection = null;
|
|
this.selection = new Set();
|
|
}
|
|
|
|
|
|
Selection.prototype.isEmpty = function() {
|
|
return this.selection.size == 0;
|
|
}
|
|
|
|
|
|
Selection.prototype.clear = function() {
|
|
var handler = this.handler;
|
|
this.selectionBase = null;
|
|
this.lastSelection = null;
|
|
handler.select(this.selection, false);
|
|
handler.clear();
|
|
this.selection = new Set();
|
|
}
|
|
|
|
|
|
count = 0;
|
|
|
|
Selection.prototype.select = function(s, isSelected) {
|
|
var handler = this.handler;
|
|
if (!(Symbol.iterator in Object(s))) { s = [s]; }
|
|
if (isSelected) {
|
|
let first = true;
|
|
for (let i of s) {
|
|
if (first) {
|
|
this.selectionBase = i;
|
|
this.lastSelection = i;
|
|
first = false;
|
|
}
|
|
this.selection.add(i);
|
|
}
|
|
handler.select(this.selection, true);
|
|
} else {
|
|
let unselectSet = new Set();
|
|
for (let i of s) {
|
|
if (this.selection.has(i)) {
|
|
unselectSet.add(i);
|
|
this.selection.delete(i);
|
|
}
|
|
}
|
|
handler.select(unselectSet, false);
|
|
}
|
|
}
|
|
|
|
|
|
Selection.prototype.extendTo = function(pos) {
|
|
if (pos == this.lastSelection || this.lastSelection === null) return;
|
|
|
|
var handler = this.handler;
|
|
var pos_diff = handler.selectionDifference(pos, true, this.lastSelection, false);
|
|
var unselect_diff = [];
|
|
if (pos_diff.length == 0) {
|
|
pos_diff = handler.selectionDifference(this.selectionBase, false, pos, true);
|
|
if (pos_diff.length != 0) {
|
|
unselect_diff = handler.selectionDifference(this.lastSelection, true, this.selectionBase, false);
|
|
this.selection = new Set();
|
|
this.selection.add(this.selectionBase);
|
|
for (var d of pos_diff) {
|
|
this.selection.add(d);
|
|
}
|
|
} else {
|
|
unselect_diff = handler.selectionDifference(this.lastSelection, true, pos, false);
|
|
for (var d of unselect_diff) {
|
|
this.selection.delete(d);
|
|
}
|
|
}
|
|
} else {
|
|
unselect_diff = handler.selectionDifference(this.selectionBase, false, this.lastSelection, true);
|
|
if (unselect_diff != 0) {
|
|
pos_diff = handler.selectionDifference(pos, true, this.selectionBase, false);
|
|
if (pos_diff.length == 0) {
|
|
unselect_diff = handler.selectionDifference(pos, false, this.lastSelection, true);
|
|
}
|
|
for (var d of unselect_diff) {
|
|
this.selection.delete(d);
|
|
}
|
|
}
|
|
if (pos_diff.length != 0) {
|
|
for (var d of pos_diff) {
|
|
this.selection.add(d);
|
|
}
|
|
}
|
|
}
|
|
handler.select(unselect_diff, false);
|
|
handler.select(pos_diff, true);
|
|
this.lastSelection = pos;
|
|
}
|
|
|
|
|
|
Selection.prototype.detachSelection = function() {
|
|
var result = new Set();
|
|
for (var i of this.selection) {
|
|
result.add(i);
|
|
}
|
|
this.clear();
|
|
return result;
|
|
}
|