You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
6.0 KiB

/**
* GroupTreeNode constructor.
*
* @param kwArgs.id [String] DOM node id
* @param kwArgs.groupName [String] Name of the group
* @param kwArgs.groupPath [String] Path of the group
*/
bobj.crv.newGroupTreeNode = function(kwArgs) {
var UPDATE = MochiKit.Base.update;
kwArgs = UPDATE ( {
id : bobj.uniqueId ()
}, kwArgs);
var iconAlt = null;
var iconId = -1; // by default, no icon
if (!kwArgs.isVisible) {
iconId = 0;
iconAlt = L_bobj_crv_Tree_Drilldown_Node.replace ('%1', kwArgs.groupName);
}
var o = newTreeWidgetElem (iconId, kwArgs.groupName, kwArgs.groupPath, null, null, null, iconAlt, null, null, false);
o._children = [];
o._curSigs = [];
bobj.fillIn (o, kwArgs);
o.widgetType = 'GroupTreeNode';
o.initOld = o.init;
o.selectOld = o.select;
o.select = bobj.crv.GroupTreeNode._drilldown;
if (!kwArgs.isVisible) {
o.setCursorClass('drill_cursor');
}
UPDATE (o, bobj.crv.GroupTreeNode);
return o;
};
bobj.crv.GroupTreeNode = {
/**
* Diposes grouptree node. Deletes all signals and children
*/
dispose : function() {
while (this._curSigs.length > 0) {
bobj.crv.SignalDisposer.dispose (this._curSigs.pop ());
}
while (this._children.length > 0) {
var child = this._children.pop ();
child.dispose ();
bobj.deleteWidget (child);
delete child;
}
this.sub = [];
//layers of all GroupTreeNodes are disposed in GroupTree.dispose in one batch for performance reason
},
init : function(layer) {
this.initOld (layer);
this._setVisualStyle ();
if (this.isStatic) {
/*"treeNormal" is the default css class for tree node text */
var spans = MochiKit.DOM.getElementsByTagAndClassName ("span", "treeNormal", this.layer);
if (spans && spans.length > 0)
spans[0].style.cursor = 'text';
}
},
/**
* @return boolean true if node is expanded
*/
isExpanded : function() {
var elemId = TreeIdToIdx (this.layer);
return _TreeWidgetElemInstances[elemId].expanded;
},
/**
* expands node and shows its children
*/
expand : function() {
var elemId = TreeIdToIdx (this.layer);
_TreeWidgetElemInstances[elemId].expanded = false
TreeWidget_toggleCB (elemId);
},
collapse : function() {
var elemId = TreeIdToIdx (this.layer);
_TreeWidgetElemInstances[elemId].expanded = true
TreeWidget_toggleCB (elemId);
},
_setVisualStyle : function() {
try {
var textNode = this.layer.lastChild;
var parentNode = this.treeView;
} catch (err) {
return;
}
var pvStyle = parentNode.visualStyle;
var tStyle = textNode.style;
if (pvStyle.fontFamily)
tStyle.fontFamily = pvStyle.fontFamily;
if (pvStyle.fontWeight)
tStyle.fontWeight = pvStyle.fontWeight;
if (pvStyle.textDecoration)
tStyle.textDecoration = pvStyle.textDecoration;
if (pvStyle.color)
tStyle.color = pvStyle.color;
if (pvStyle.fontStyle)
tStyle.fontStyle = pvStyle.fontStyle;
if (pvStyle.fontSize)
tStyle.fontSize = pvStyle.fontSize;
},
/**
* Delay add the child nodes to a node recursively.
* The addition of nodes has to happen in a top-down fashion because each node has a reference to the tree
* and this reference is retrieved from the parent node.
*/
delayedAddChild : function(enableDrilldown, enableNavigation) {
var CONNECT = MochiKit.Signal.connect;
var SIGNAL = MochiKit.Signal.signal;
var PARTIAL = MochiKit.Base.partial;
var childCount = this._children.length;
if (childCount > 0) {
this.expanded = true;
} else {
this.expanded = false;
if (!this.leaf) {
this.setIncomplete (bobj.crv.GroupTreeNode._getChildren);
}
}
var children = this._children;
for ( var i = 0; i < childCount; i++) {
var childNode = children[i];
childNode.expandPath = this.expandPath + '-' + i;
childNode._updateProperty (enableDrilldown, enableNavigation);
this.add (childNode);
this._curSigs.push (CONNECT (childNode, 'grpDrilldown', PARTIAL (SIGNAL, this, 'grpDrilldown')));
this._curSigs.push (CONNECT (childNode, 'grpNodeRetrieveChildren', PARTIAL (SIGNAL, this, 'grpNodeRetrieveChildren')));
childNode.delayedAddChild (enableDrilldown, enableNavigation);
}
},
addChild : function(widget) {
this._children.push (widget);
},
getLevel : function() {
return this.expandPath.split('-').length;
},
/**
* Private. Callback function when a group tree node is clicked, which is a group drilldown.
*/
_drilldown : function() {
this.selectOld ();
MochiKit.Signal.signal (this, 'grpDrilldown', this.groupName, this.groupPath, this.isVisible, this.groupNamePath);
},
/**
* Private. Callback function when an incomplete group tree node is expanded.
*/
_getChildren : function() {
this.plusLyr.src = _skin + '../loading.gif';
MochiKit.Signal.signal (this, 'grpNodeRetrieveChildren', this.expandPath);
},
/**
* Private. Change the select event handler and text style class based on the two given flags.
*/
_updateProperty : function(enableDrilldown, enableNavigation) {
var isStatic = false;
if (this.isVisible && !enableNavigation) {
isStatic = true;
} else if (!this.isVisible && !enableDrilldown) {
isStatic = true;
}
if (isStatic) {
this.select = MochiKit.Base.noop;
}
this.isStatic = isStatic;
}
};