Subversion Repositories Applications.papyrus

Rev

Rev 1372 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1318 alexandre_ 1
/*
2
	Copyright (c) 2004-2006, The Dojo Foundation
3
	All Rights Reserved.
4
 
5
	Licensed under the Academic Free License version 2.1 or above OR the
6
	modified BSD license. For more information on Dojo licensing, see:
7
 
8
		http://dojotoolkit.org/community/licensing.shtml
9
*/
10
 
1422 alexandre_ 11
 
12
 
1318 alexandre_ 13
dojo.provide("dojo.widget.TreeSelectorV3");
14
dojo.require("dojo.widget.HtmlWidget");
15
dojo.require("dojo.widget.TreeCommon");
16
dojo.widget.defineWidget("dojo.widget.TreeSelectorV3", [dojo.widget.HtmlWidget, dojo.widget.TreeCommon], function () {
17
	this.eventNames = {};
18
	this.listenedTrees = {};
19
	this.selectedNodes = [];
20
	this.lastClicked = {};
21
}, {listenTreeEvents:["afterTreeCreate", "afterCollapse", "afterChangeTree", "afterDetach", "beforeTreeDestroy"], listenNodeFilter:function (elem) {
22
	return elem instanceof dojo.widget.Widget;
23
}, allowedMulti:true, dblselectTimeout:300, eventNamesDefault:{select:"select", deselect:"deselect", dblselect:"dblselect"}, onAfterTreeCreate:function (message) {
24
	var tree = message.source;
25
	dojo.event.browser.addListener(tree.domNode, "onclick", dojo.lang.hitch(this, this.onTreeClick));
26
	if (dojo.render.html.ie) {
27
		dojo.event.browser.addListener(tree.domNode, "ondblclick", dojo.lang.hitch(this, this.onTreeDblClick));
28
	}
29
	dojo.event.browser.addListener(tree.domNode, "onKey", dojo.lang.hitch(this, this.onKey));
30
}, onKey:function (e) {
31
	if (!e.key || e.ctrkKey || e.altKey) {
32
		return;
33
	}
34
	switch (e.key) {
35
	  case e.KEY_ENTER:
36
		var node = this.domElement2TreeNode(e.target);
37
		if (node) {
38
			this.processNode(node, e);
39
		}
40
	}
41
}, onAfterChangeTree:function (message) {
42
	if (!message.oldTree && message.node.selected) {
43
		this.select(message.node);
44
	}
45
	if (!message.newTree || !this.listenedTrees[message.newTree.widgetId]) {
46
		if (this.selectedNode && message.node.children) {
47
			this.deselectIfAncestorMatch(message.node);
48
		}
49
	}
50
}, initialize:function (args) {
1422 alexandre_ 51
	for (var name in this.eventNamesDefault) {
1318 alexandre_ 52
		if (dojo.lang.isUndefined(this.eventNames[name])) {
53
			this.eventNames[name] = this.widgetId + "/" + this.eventNamesDefault[name];
54
		}
55
	}
56
}, onBeforeTreeDestroy:function (message) {
57
	this.unlistenTree(message.source);
58
}, onAfterCollapse:function (message) {
59
	this.deselectIfAncestorMatch(message.source);
60
}, onTreeDblClick:function (event) {
61
	this.onTreeClick(event);
62
}, checkSpecialEvent:function (event) {
63
	return event.shiftKey || event.ctrlKey;
64
}, onTreeClick:function (event) {
65
	var node = this.domElement2TreeNode(event.target);
66
	if (!node) {
67
		return;
68
	}
69
	var checkLabelClick = function (domElement) {
70
		return domElement === node.labelNode;
71
	};
72
	if (this.checkPathCondition(event.target, checkLabelClick)) {
73
		this.processNode(node, event);
74
	}
75
}, processNode:function (node, event) {
76
	if (node.actionIsDisabled(node.actions.SELECT)) {
77
		return;
78
	}
79
	if (dojo.lang.inArray(this.selectedNodes, node)) {
80
		if (this.checkSpecialEvent(event)) {
81
			this.deselect(node);
82
			return;
83
		}
84
		var _this = this;
85
		var i = 0;
86
		var selectedNode;
87
		while (this.selectedNodes.length > i) {
88
			selectedNode = this.selectedNodes[i];
89
			if (selectedNode !== node) {
90
				this.deselect(selectedNode);
91
				continue;
92
			}
93
			i++;
94
		}
95
		var wasJustClicked = this.checkRecentClick(node);
96
		eventName = wasJustClicked ? this.eventNames.dblselect : this.eventNames.select;
97
		if (wasJustClicked) {
98
			eventName = this.eventNames.dblselect;
99
			this.forgetLastClicked();
100
		} else {
101
			eventName = this.eventNames.select;
102
			this.setLastClicked(node);
103
		}
104
		dojo.event.topic.publish(eventName, {node:node});
105
		return;
106
	}
107
	this.deselectIfNoMulti(event);
108
	this.setLastClicked(node);
109
	this.select(node);
110
}, forgetLastClicked:function () {
111
	this.lastClicked = {};
112
}, setLastClicked:function (node) {
113
	this.lastClicked.date = new Date();
114
	this.lastClicked.node = node;
115
}, checkRecentClick:function (node) {
116
	var diff = new Date() - this.lastClicked.date;
117
	if (this.lastClicked.node && diff < this.dblselectTimeout) {
118
		return true;
119
	} else {
120
		return false;
121
	}
122
}, deselectIfNoMulti:function (event) {
123
	if (!this.checkSpecialEvent(event) || !this.allowedMulti) {
124
		this.deselectAll();
125
	}
126
}, deselectIfAncestorMatch:function (ancestor) {
127
	var _this = this;
128
	dojo.lang.forEach(this.selectedNodes, function (node) {
129
		var selectedNode = node;
130
		node = node.parent;
131
		while (node && node.isTreeNode) {
132
			if (node === ancestor) {
133
				_this.deselect(selectedNode);
134
				return;
135
			}
136
			node = node.parent;
137
		}
138
	});
139
}, onAfterDetach:function (message) {
140
	this.deselectIfAncestorMatch(message.child);
141
}, select:function (node) {
142
	var index = dojo.lang.find(this.selectedNodes, node, true);
143
	if (index >= 0) {
144
		return;
145
	}
146
	this.selectedNodes.push(node);
147
	dojo.event.topic.publish(this.eventNames.select, {node:node});
148
}, deselect:function (node) {
149
	var index = dojo.lang.find(this.selectedNodes, node, true);
150
	if (index < 0) {
151
		return;
152
	}
153
	this.selectedNodes.splice(index, 1);
154
	dojo.event.topic.publish(this.eventNames.deselect, {node:node});
155
}, deselectAll:function () {
156
	while (this.selectedNodes.length) {
157
		this.deselect(this.selectedNodes[0]);
158
	}
159
}});
160