1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
/**
* Ext.ux.tree.MultiSelectionModelFix.js
*
* Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com>
*
* This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
* the additional special exception to link portions of this program with the OpenSSL library.
* See LICENSE for more details.
*/
/**
* This enhances the MSM to allow for shift selecting in tree grids etc.
* @author Damien Churchill <damoxc@gmail.com>
*/
Ext.override(Ext.tree.MultiSelectionModel, {
onNodeClick: function (node, e) {
if (e.ctrlKey && this.isSelected(node)) {
this.unselect(node);
} else if (e.shiftKey && !this.isSelected(node)) {
var parentNode = node.parentNode;
// We can only shift select files in the same node
if (this.lastSelNode.parentNode.id != parentNode.id) return;
// Get the node indexes
var fi = parentNode.indexOf(node),
li = parentNode.indexOf(this.lastSelNode);
// Select the last clicked node and wipe old selections
this.select(this.lastSelNode, e, false, true);
// Swap the values if required
if (fi > li) {
(fi = fi + li), (li = fi - li), (fi = fi - li);
}
// Select all the nodes
parentNode.eachChild(function (n) {
var i = parentNode.indexOf(n);
if (fi < i && i < li) {
this.select(n, e, true, true);
}
}, this);
// Select the clicked node
this.select(node, e, true);
} else {
this.select(node, e, e.ctrlKey);
}
},
select: function (node, e, keepExisting, suppressEvent) {
if (keepExisting !== true) {
this.clearSelections(true);
}
if (this.isSelected(node)) {
this.lastSelNode = node;
return node;
}
this.selNodes.push(node);
this.selMap[node.id] = node;
this.lastSelNode = node;
node.ui.onSelectedChange(true);
if (suppressEvent !== true) {
this.fireEvent('selectionchange', this, this.selNodes);
}
return node;
},
});
|