Subversion Repositories Applications.papyrus

Rev

Rev 1372 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1372 Rev 1422
1
/*
1
/*
2
	Copyright (c) 2004-2006, The Dojo Foundation
2
	Copyright (c) 2004-2006, The Dojo Foundation
3
	All Rights Reserved.
3
	All Rights Reserved.
4
 
4
 
5
	Licensed under the Academic Free License version 2.1 or above OR the
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:
6
	modified BSD license. For more information on Dojo licensing, see:
7
 
7
 
8
		http://dojotoolkit.org/community/licensing.shtml
8
		http://dojotoolkit.org/community/licensing.shtml
9
*/
9
*/
-
 
10
 
-
 
11
 
10
 
12
 
11
dojo.provide("dojo.widget.TreeV3");
13
dojo.provide("dojo.widget.TreeV3");
12
dojo.require("dojo.widget.TreeWithNode");
14
dojo.require("dojo.widget.TreeWithNode");
13
dojo.require("dojo.widget.*");
15
dojo.require("dojo.widget.*");
14
dojo.require("dojo.event.*");
16
dojo.require("dojo.event.*");
15
dojo.require("dojo.io.*");
17
dojo.require("dojo.io.*");
16
dojo.require("dojo.widget.HtmlWidget");
18
dojo.require("dojo.widget.HtmlWidget");
17
dojo.require("dojo.widget.TreeNodeV3");
19
dojo.require("dojo.widget.TreeNodeV3");
18
dojo.widget.defineWidget("dojo.widget.TreeV3", [dojo.widget.HtmlWidget, dojo.widget.TreeWithNode], function () {
20
dojo.widget.defineWidget("dojo.widget.TreeV3", [dojo.widget.HtmlWidget, dojo.widget.TreeWithNode], function () {
19
	this.eventNames = {};
21
	this.eventNames = {};
20
	this.DndAcceptTypes = [];
22
	this.DndAcceptTypes = [];
21
	this.actionsDisabled = [];
23
	this.actionsDisabled = [];
22
	this.listeners = [];
24
	this.listeners = [];
23
	this.tree = this;
25
	this.tree = this;
24
}, {DndMode:"", defaultChildWidget:null, defaultChildTitle:"New Node", eagerWidgetInstantiation:false, eventNamesDefault:{afterTreeCreate:"afterTreeCreate", beforeTreeDestroy:"beforeTreeDestroy", beforeNodeDestroy:"beforeNodeDestroy", afterChangeTree:"afterChangeTree", afterSetFolder:"afterSetFolder", afterUnsetFolder:"afterUnsetFolder", beforeMoveFrom:"beforeMoveFrom", beforeMoveTo:"beforeMoveTo", afterMoveFrom:"afterMoveFrom", afterMoveTo:"afterMoveTo", afterAddChild:"afterAddChild", afterDetach:"afterDetach", afterExpand:"afterExpand", beforeExpand:"beforeExpand", afterSetTitle:"afterSetTitle", afterCollapse:"afterCollapse", beforeCollapse:"beforeCollapse"}, classPrefix:"Tree", style:"", allowAddChildToLeaf:true, unsetFolderOnEmpty:true, DndModes:{BETWEEN:1, ONTO:2}, DndAcceptTypes:"", templateCssString:"/* indent for all tree children excepts root */\n.TreeNode {\n	background-image : url('../templates/images/TreeV3/i.gif');\n	background-position : top left;\n	background-repeat : repeat-y;\n	margin-left: 19px;\n	zoom: 1;\n}\n.TreeIsRoot {\n	margin-left: 0;\n}\n \n/* left vertical line (grid) for all nodes */\n.TreeIsLast {\n	background-image: url('../templates/images/TreeV3/i_half.gif');\n	background-repeat : no-repeat;\n}\n \n.TreeExpandOpen .TreeExpand {\n	background-image: url('../templates/images/TreeV3/expand_minus.gif');\n}\n \n/* closed is higher priority than open */\n.TreeExpandClosed .TreeExpand {\n	background-image: url('../templates/images/TreeV3/expand_plus.gif');\n}\n \n/* highest priority */\n.TreeExpandLeaf .TreeExpand {\n	background-image: url('../templates/images/TreeV3/expand_leaf.gif');\n}\n\n/* \nshould always override any expand setting, but do not touch children.\nif I add .TreeExpand .TreeExpandLoading same time and put it to top/bottom, then it will take precedence over +- for all descendants or always fail\nso I have to remove TreeExpand and process this one specifically\n*/\n\n.TreeExpandLoading   {\n	width: 18px;\n	height: 18px;\n	float: left;\n	display: inline;\n	background-repeat : no-repeat;\n	background-image: url('../templates/images/TreeV3/expand_loading.gif');\n}\n \n.TreeContent {\n	min-height: 18px;\n	min-width: 18px;\n	margin-left:18px;\n	cursor: default;\n	/* can't make inline - multiline bugs */\n}\n\n.TreeIEContent {\n\theight: 18px;\n}\n \n.TreeExpand {\n	width: 18px;\n	height: 18px;\n	float: left;\n	display: inline;\n	background-repeat : no-repeat;\n}\n \n/* same style as IE selection */\n.TreeNodeEmphasized {\n	background-color: Highlight;\n	color: HighlightText;\n}\n \n.TreeContent .RichTextEditable, .TreeContent .RichTextEditable iframe {\n	  background-color: #ffc;\n	  color: black;\n}\n\n/* don't use :focus due to opera's lack of support on div's */\n.TreeLabelFocused {\n	  outline: 1px invert dotted;\n}\n", templateCssPath:dojo.uri.moduleUri("dojo.widget", "templates/TreeV3.css"), templateString:"<div style=\"${this.style}\">\n</div>", isExpanded:true, isTree:true, createNode:function (data) {
26
}, {DndMode:"", defaultChildWidget:null, defaultChildTitle:"New Node", eagerWidgetInstantiation:false, eventNamesDefault:{afterTreeCreate:"afterTreeCreate", beforeTreeDestroy:"beforeTreeDestroy", beforeNodeDestroy:"beforeNodeDestroy", afterChangeTree:"afterChangeTree", afterSetFolder:"afterSetFolder", afterUnsetFolder:"afterUnsetFolder", beforeMoveFrom:"beforeMoveFrom", beforeMoveTo:"beforeMoveTo", afterMoveFrom:"afterMoveFrom", afterMoveTo:"afterMoveTo", afterAddChild:"afterAddChild", afterDetach:"afterDetach", afterExpand:"afterExpand", beforeExpand:"beforeExpand", afterSetTitle:"afterSetTitle", afterCollapse:"afterCollapse", beforeCollapse:"beforeCollapse"}, classPrefix:"Tree", style:"", allowAddChildToLeaf:true, unsetFolderOnEmpty:true, DndModes:{BETWEEN:1, ONTO:2}, DndAcceptTypes:"", templateCssString:"/* indent for all tree children excepts root */\n.TreeNode {\n	background-image : url('../templates/images/TreeV3/i.gif');\n	background-position : top left;\n	background-repeat : repeat-y;\n	margin-left: 19px;\n	zoom: 1;\n}\n.TreeIsRoot {\n	margin-left: 0;\n}\n \n/* left vertical line (grid) for all nodes */\n.TreeIsLast {\n	background-image: url('../templates/images/TreeV3/i_half.gif');\n	background-repeat : no-repeat;\n}\n \n.TreeExpandOpen .TreeExpand {\n	background-image: url('../templates/images/TreeV3/expand_minus.gif');\n}\n \n/* closed is higher priority than open */\n.TreeExpandClosed .TreeExpand {\n	background-image: url('../templates/images/TreeV3/expand_plus.gif');\n}\n \n/* highest priority */\n.TreeExpandLeaf .TreeExpand {\n	background-image: url('../templates/images/TreeV3/expand_leaf.gif');\n}\n\n/* \nshould always override any expand setting, but do not touch children.\nif I add .TreeExpand .TreeExpandLoading same time and put it to top/bottom, then it will take precedence over +- for all descendants or always fail\nso I have to remove TreeExpand and process this one specifically\n*/\n\n.TreeExpandLoading   {\n	width: 18px;\n	height: 18px;\n	float: left;\n	display: inline;\n	background-repeat : no-repeat;\n	background-image: url('../templates/images/TreeV3/expand_loading.gif');\n}\n \n.TreeContent {\n	min-height: 18px;\n	min-width: 18px;\n	margin-left:18px;\n	cursor: default;\n	/* can't make inline - multiline bugs */\n}\n\n.TreeIEContent {\n\theight: 18px;\n}\n \n.TreeExpand {\n	width: 18px;\n	height: 18px;\n	float: left;\n	display: inline;\n	background-repeat : no-repeat;\n}\n \n/* same style as IE selection */\n.TreeNodeEmphasized {\n	background-color: Highlight;\n	color: HighlightText;\n}\n \n.TreeContent .RichTextEditable, .TreeContent .RichTextEditable iframe {\n	  background-color: #ffc;\n	  color: black;\n}\n\n/* don't use :focus due to opera's lack of support on div's */\n.TreeLabelFocused {\n	  outline: 1px invert dotted;\n}\n", templateCssPath:dojo.uri.moduleUri("dojo.widget", "templates/TreeV3.css"), templateString:"<div style=\"${this.style}\">\n</div>", isExpanded:true, isTree:true, createNode:function (data) {
25
	data.tree = this.widgetId;
27
	data.tree = this.widgetId;
26
	if (data.widgetName) {
28
	if (data.widgetName) {
27
		return dojo.widget.createWidget(data.widgetName, data);
29
		return dojo.widget.createWidget(data.widgetName, data);
28
	} else {
30
	} else {
29
		if (this.defaultChildWidget.prototype.createSimple) {
31
		if (this.defaultChildWidget.prototype.createSimple) {
30
			return this.defaultChildWidget.prototype.createSimple(data);
32
			return this.defaultChildWidget.prototype.createSimple(data);
31
		} else {
33
		} else {
32
			var ns = this.defaultChildWidget.prototype.ns;
34
			var ns = this.defaultChildWidget.prototype.ns;
33
			var wt = this.defaultChildWidget.prototype.widgetType;
35
			var wt = this.defaultChildWidget.prototype.widgetType;
34
			return dojo.widget.createWidget(ns + ":" + wt, data);
36
			return dojo.widget.createWidget(ns + ":" + wt, data);
35
		}
37
		}
36
	}
38
	}
37
}, makeNodeTemplate:function () {
39
}, makeNodeTemplate:function () {
38
	var domNode = document.createElement("div");
40
	var domNode = document.createElement("div");
39
	dojo.html.setClass(domNode, this.classPrefix + "Node " + this.classPrefix + "ExpandLeaf " + this.classPrefix + "ChildrenNo");
41
	dojo.html.setClass(domNode, this.classPrefix + "Node " + this.classPrefix + "ExpandLeaf " + this.classPrefix + "ChildrenNo");
40
	this.nodeTemplate = domNode;
42
	this.nodeTemplate = domNode;
41
	var expandNode = document.createElement("div");
43
	var expandNode = document.createElement("div");
42
	var clazz = this.classPrefix + "Expand";
44
	var clazz = this.classPrefix + "Expand";
43
	if (dojo.render.html.ie) {
45
	if (dojo.render.html.ie) {
44
		clazz = clazz + " " + this.classPrefix + "IEExpand";
46
		clazz = clazz + " " + this.classPrefix + "IEExpand";
45
	}
47
	}
46
	dojo.html.setClass(expandNode, clazz);
48
	dojo.html.setClass(expandNode, clazz);
47
	this.expandNodeTemplate = expandNode;
49
	this.expandNodeTemplate = expandNode;
48
	var labelNode = document.createElement("span");
50
	var labelNode = document.createElement("span");
49
	dojo.html.setClass(labelNode, this.classPrefix + "Label");
51
	dojo.html.setClass(labelNode, this.classPrefix + "Label");
50
	this.labelNodeTemplate = labelNode;
52
	this.labelNodeTemplate = labelNode;
51
	var contentNode = document.createElement("div");
53
	var contentNode = document.createElement("div");
52
	var clazz = this.classPrefix + "Content";
54
	var clazz = this.classPrefix + "Content";
53
	if (dojo.render.html.ie && !dojo.render.html.ie70) {
55
	if (dojo.render.html.ie && !dojo.render.html.ie70) {
54
		clazz = clazz + " " + this.classPrefix + "IEContent";
56
		clazz = clazz + " " + this.classPrefix + "IEContent";
55
	}
57
	}
56
	dojo.html.setClass(contentNode, clazz);
58
	dojo.html.setClass(contentNode, clazz);
57
	this.contentNodeTemplate = contentNode;
59
	this.contentNodeTemplate = contentNode;
58
	domNode.appendChild(expandNode);
60
	domNode.appendChild(expandNode);
59
	domNode.appendChild(contentNode);
61
	domNode.appendChild(contentNode);
60
	contentNode.appendChild(labelNode);
62
	contentNode.appendChild(labelNode);
61
}, makeContainerNodeTemplate:function () {
63
}, makeContainerNodeTemplate:function () {
62
	var div = document.createElement("div");
64
	var div = document.createElement("div");
63
	div.style.display = "none";
65
	div.style.display = "none";
64
	dojo.html.setClass(div, this.classPrefix + "Container");
66
	dojo.html.setClass(div, this.classPrefix + "Container");
65
	this.containerNodeTemplate = div;
67
	this.containerNodeTemplate = div;
66
}, actions:{ADDCHILD:"ADDCHILD"}, getInfo:function () {
68
}, actions:{ADDCHILD:"ADDCHILD"}, getInfo:function () {
67
	var info = {widgetId:this.widgetId, objectId:this.objectId};
69
	var info = {widgetId:this.widgetId, objectId:this.objectId};
68
	return info;
70
	return info;
69
}, adjustEventNames:function () {
71
}, adjustEventNames:function () {
70
	for (var name in this.eventNamesDefault) {
72
	for (var name in this.eventNamesDefault) {
71
		if (dojo.lang.isUndefined(this.eventNames[name])) {
73
		if (dojo.lang.isUndefined(this.eventNames[name])) {
72
			this.eventNames[name] = this.widgetId + "/" + this.eventNamesDefault[name];
74
			this.eventNames[name] = this.widgetId + "/" + this.eventNamesDefault[name];
73
		}
75
		}
74
	}
76
	}
75
}, adjustDndMode:function () {
77
}, adjustDndMode:function () {
76
	var _this = this;
78
	var _this = this;
77
	var DndMode = 0;
79
	var DndMode = 0;
78
	dojo.lang.forEach(this.DndMode.split(";"), function (elem) {
80
	dojo.lang.forEach(this.DndMode.split(";"), function (elem) {
79
		var mode = _this.DndModes[dojo.string.trim(elem).toUpperCase()];
81
		var mode = _this.DndModes[dojo.string.trim(elem).toUpperCase()];
80
		if (mode) {
82
		if (mode) {
81
			DndMode = DndMode | mode;
83
			DndMode = DndMode | mode;
82
		}
84
		}
83
	});
85
	});
84
	this.DndMode = DndMode;
86
	this.DndMode = DndMode;
85
}, destroy:function () {
87
}, destroy:function () {
86
	dojo.event.topic.publish(this.tree.eventNames.beforeTreeDestroy, {source:this});
88
	dojo.event.topic.publish(this.tree.eventNames.beforeTreeDestroy, {source:this});
87
	return dojo.widget.HtmlWidget.prototype.destroy.apply(this, arguments);
89
	return dojo.widget.HtmlWidget.prototype.destroy.apply(this, arguments);
88
}, initialize:function (args) {
90
}, initialize:function (args) {
89
	this.domNode.widgetId = this.widgetId;
91
	this.domNode.widgetId = this.widgetId;
90
	for (var i = 0; i < this.actionsDisabled.length; i++) {
92
	for (var i = 0; i < this.actionsDisabled.length; i++) {
91
		this.actionsDisabled[i] = this.actionsDisabled[i].toUpperCase();
93
		this.actionsDisabled[i] = this.actionsDisabled[i].toUpperCase();
92
	}
94
	}
93
	if (!args.defaultChildWidget) {
95
	if (!args.defaultChildWidget) {
94
		this.defaultChildWidget = dojo.widget.TreeNodeV3;
96
		this.defaultChildWidget = dojo.widget.TreeNodeV3;
95
	} else {
97
	} else {
96
		this.defaultChildWidget = dojo.lang.getObjPathValue(args.defaultChildWidget);
98
		this.defaultChildWidget = dojo.lang.getObjPathValue(args.defaultChildWidget);
97
	}
99
	}
98
	this.adjustEventNames();
100
	this.adjustEventNames();
99
	this.adjustDndMode();
101
	this.adjustDndMode();
100
	this.makeNodeTemplate();
102
	this.makeNodeTemplate();
101
	this.makeContainerNodeTemplate();
103
	this.makeContainerNodeTemplate();
102
	this.containerNode = this.domNode;
104
	this.containerNode = this.domNode;
103
	dojo.html.setClass(this.domNode, this.classPrefix + "Container");
105
	dojo.html.setClass(this.domNode, this.classPrefix + "Container");
104
	var _this = this;
106
	var _this = this;
105
	dojo.lang.forEach(this.listeners, function (elem) {
107
	dojo.lang.forEach(this.listeners, function (elem) {
106
		var t = dojo.lang.isString(elem) ? dojo.widget.byId(elem) : elem;
108
		var t = dojo.lang.isString(elem) ? dojo.widget.byId(elem) : elem;
107
		t.listenTree(_this);
109
		t.listenTree(_this);
108
	});
110
	});
109
}, postCreate:function () {
111
}, postCreate:function () {
110
	dojo.event.topic.publish(this.eventNames.afterTreeCreate, {source:this});
112
	dojo.event.topic.publish(this.eventNames.afterTreeCreate, {source:this});
111
}, move:function (child, newParent, index) {
113
}, move:function (child, newParent, index) {
112
	if (!child.parent) {
114
	if (!child.parent) {
113
		dojo.raise(this.widgetType + ": child can be moved only while it's attached");
115
		dojo.raise(this.widgetType + ": child can be moved only while it's attached");
114
	}
116
	}
115
	var oldParent = child.parent;
117
	var oldParent = child.parent;
116
	var oldTree = child.tree;
118
	var oldTree = child.tree;
117
	var oldIndex = child.getParentIndex();
119
	var oldIndex = child.getParentIndex();
118
	var newTree = newParent.tree;
120
	var newTree = newParent.tree;
119
	var newParent = newParent;
121
	var newParent = newParent;
120
	var newIndex = index;
122
	var newIndex = index;
121
	var message = {oldParent:oldParent, oldTree:oldTree, oldIndex:oldIndex, newParent:newParent, newTree:newTree, newIndex:newIndex, child:child};
123
	var message = {oldParent:oldParent, oldTree:oldTree, oldIndex:oldIndex, newParent:newParent, newTree:newTree, newIndex:newIndex, child:child};
122
	dojo.event.topic.publish(oldTree.eventNames.beforeMoveFrom, message);
124
	dojo.event.topic.publish(oldTree.eventNames.beforeMoveFrom, message);
123
	dojo.event.topic.publish(newTree.eventNames.beforeMoveTo, message);
125
	dojo.event.topic.publish(newTree.eventNames.beforeMoveTo, message);
124
	this.doMove.apply(this, arguments);
126
	this.doMove.apply(this, arguments);
125
	dojo.event.topic.publish(oldTree.eventNames.afterMoveFrom, message);
127
	dojo.event.topic.publish(oldTree.eventNames.afterMoveFrom, message);
126
	dojo.event.topic.publish(newTree.eventNames.afterMoveTo, message);
128
	dojo.event.topic.publish(newTree.eventNames.afterMoveTo, message);
127
}, doMove:function (child, newParent, index) {
129
}, doMove:function (child, newParent, index) {
128
	child.doDetach();
130
	child.doDetach();
129
	newParent.doAddChild(child, index);
131
	newParent.doAddChild(child, index);
130
}, toString:function () {
132
}, toString:function () {
131
	return "[" + this.widgetType + " ID:" + this.widgetId + "]";
133
	return "[" + this.widgetType + " ID:" + this.widgetId + "]";
132
}});
134
}});
133
 
135