@openui5/sap.m
Version:
OpenUI5 UI Library sap.m
394 lines (337 loc) • 9.19 kB
JavaScript
/*!
* OpenUI5
* (c) Copyright 2009-2023 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
// Provides control sap.m.StandardListItem.
sap.ui.define([
'./ListItemBase',
'./library',
'sap/ui/core/IconPool',
'sap/ui/core/Icon',
'./TreeItemBaseRenderer',
'sap/ui/events/KeyCodes'
],
function(ListItemBase, library, IconPool, Icon, TreeItemBaseRenderer, KeyCodes) {
"use strict";
// shortcut for sap.m.ListMode
var ListMode = library.ListMode;
/**
* Constructor for a new TreeItemBase.
*
* @param {string} [sId] ID for the new control, generated automatically if no id is given
* @param {object} [mSettings] Initial settings for the new control
*
* @class
* The <code>sap.m.TreeItemBase</code> contains the basic features of all specific tree items.
* @extends sap.m.ListItemBase
*
* @author SAP SE
* @version 1.117.4
*
* @constructor
* @public
* @since 1.42.0
* @alias sap.m.TreeItemBase
*/
var TreeItemBase = ListItemBase.extend("sap.m.TreeItemBase", /** @lends sap.m.TreeItemBase.prototype */ {
metadata : {
library : "sap.m"
},
renderer: TreeItemBaseRenderer
});
TreeItemBase.prototype.ExpandedIconURI = IconPool.getIconURI("navigation-down-arrow");
TreeItemBase.prototype.CollapsedIconURI = IconPool.getIconURI("navigation-right-arrow");
TreeItemBase.prototype.getTree = function() {
var oParent = this.getParent();
if (oParent && oParent.isA("sap.m.Tree")) {
return oParent;
}
};
TreeItemBase.prototype.getList = TreeItemBase.prototype.getTree;
TreeItemBase.prototype.informTree = TreeItemBase.prototype.informList;
/**
* Gets the context of the node.
*
* @returns {Object}
* @public
* @since 1.42.0
*/
TreeItemBase.prototype.getItemNodeContext = function() {
var oTree = this.getTree();
var oTreeProxy = this._getTreeBindingProxy();
var oNode = null;
if (oTreeProxy) {
oNode = oTreeProxy.getNodeByIndex(oTree.indexOfItem(this));
}
return oNode;
};
/**
* Gets the parent node control.
*
* @returns {sap.m.TreeItemBase | undefined}
* @public
* @since 1.42.0
*/
TreeItemBase.prototype.getParentNode = function() {
if (this.isTopLevel()) {
return;
}
var oTree = this.getTree(),
iNodeLevel = this.getLevel(),
oParentNode = null,
i = oTree.indexOfItem(this) - 1,
aItems = oTree.getItems(),
iLevel;
while (i >= 0) {
iLevel = aItems[i].getLevel();
if (iLevel === iNodeLevel - 1) {
oParentNode = aItems[i];
break;
}
i--;
}
return oParentNode;
};
/**
* Gets the context of the parent node control.
*
* @returns {Object}
* @public
* @since 1.42.0
*/
TreeItemBase.prototype.getParentNodeContext = function() {
return this.getItemNodeContext().parent;
};
/**
* Determines if the node is a leaf.
*
* @returns {boolean}
* @public
* @since 1.42.0
*/
TreeItemBase.prototype.isLeaf = function() {
var oTree = this.getTree(),
oTreeProxy = this._getTreeBindingProxy();
if (oTreeProxy) {
var iIndex = oTree.indexOfItem(this);
return oTreeProxy.isLeaf(iIndex);
}
return false;
};
/**
* Checks if the node is the top level node.
*
* @returns {boolean}
* @public
* @since 1.42.0
*/
TreeItemBase.prototype.isTopLevel = function() {
return (this.getLevel() === 0);
};
/**
* Gets the node level in the hierarchy.
*
* @returns {int}
* @public
* @since 1.42.0
*/
TreeItemBase.prototype.getLevel = function() {
return (this.getItemNodeContext() || {}).level;
};
/**
* Gets the expanding information of the node.
*
* @returns {boolean}
* @public
* @since 1.42.0
*/
TreeItemBase.prototype.getExpanded = function() {
var oTree = this.getTree(),
oTreeProxy = this._getTreeBindingProxy();
if (!oTree || !oTreeProxy) {
return false;
}
var iIndex = oTree.indexOfItem(this);
return oTreeProxy.isExpanded(iIndex);
};
TreeItemBase.prototype.setSelected = function (bSelected) {
ListItemBase.prototype.setSelected.apply(this, arguments);
// update the binding context
var oTree = this.getTree();
var oBinding = oTree ? oTree.getBinding("items") : null;
var iIndex = -1;
if (oTree && oBinding) {
iIndex = oTree.indexOfItem(this);
if (oTree.getMode() === ListMode.SingleSelect) {
oBinding.setSelectedIndex(iIndex);
}
if (oTree.getMode() === ListMode.MultiSelect) {
if (bSelected) {
oBinding.addSelectionInterval(iIndex, iIndex);
} else {
oBinding.removeSelectionInterval(iIndex, iIndex);
}
}
}
return this;
};
/**
* Gets the expander control for rendering purposes.
*
* @returns {sap.ui.core.Control}
* @private
* @since 1.42.0
*/
TreeItemBase.prototype._getExpanderControl = function() {
var sSrc = this.CollapsedIconURI,
oBundle = sap.ui.getCore().getLibraryResourceBundle("sap.m"),
sIconTooltip = oBundle.getText("TREE_ITEM_EXPAND_NODE");
if (this.getExpanded()) {
sSrc = this.ExpandedIconURI;
sIconTooltip = oBundle.getText("TREE_ITEM_COLLAPSE_NODE");
}
if (this._oExpanderControl) {
this._oExpanderControl.setSrc(sSrc);
this._oExpanderControl.setTooltip(sIconTooltip);
return this._oExpanderControl;
}
this._oExpanderControl = new Icon({
id: this.getId() + "-expander",
src: sSrc,
tooltip: sIconTooltip,
noTabStop: true
}).setParent(this, null, true).addStyleClass("sapMTreeItemBaseExpander").attachPress(function(oEvent) {
this.informTree("ExpanderPressed");
}, this);
return this._oExpanderControl;
};
TreeItemBase.prototype.invalidate = function() {
ListItemBase.prototype.invalidate.apply(this, arguments);
this._bInvalidated = true;
};
TreeItemBase.prototype.onAfterRendering = function() {
ListItemBase.prototype.onAfterRendering.apply(this, arguments);
this._bInvalidated = false;
};
TreeItemBase.prototype.setBindingContext = function() {
ListItemBase.prototype.setBindingContext.apply(this, arguments);
this.invalidate();
return this;
};
/**
* Gets the indentation of the node for rendering purposes.
*
* @returns {float}
* @private
* @since 1.42.0
*/
TreeItemBase.prototype._getPadding = function() {
var oTree = this.getTree(),
iNodeLevel = this.getLevel(),
iIndentation = 0,
iDeepestLevel;
// use number count from hierarchy binding
if (oTree) {
iDeepestLevel = oTree.getDeepestLevel();
}
// for add node
if (iDeepestLevel < iNodeLevel) {
oTree._iDeepestLevel = iNodeLevel;
iDeepestLevel = oTree._iDeepestLevel;
}
if (iDeepestLevel < 2) {
iIndentation = iNodeLevel * 1.5;
} else if (iDeepestLevel === 2) {
iIndentation = iNodeLevel * 1;
} else if (iDeepestLevel < 6) {
iIndentation = iNodeLevel * 0.5;
} else {
iIndentation = iNodeLevel * 0.25;
}
return iIndentation;
};
/**
* The event is fired when + is pressed.
*
* @param {jQuery.Event} oEvent The event object.
*/
TreeItemBase.prototype.onsapplus = function(oEvent) {
this.informTree("ExpanderPressed", true);
};
/**
* The event is fired when - is pressed.
*
* @param {jQuery.Event} oEvent The event object.
*/
TreeItemBase.prototype.onsapminus = function(oEvent) {
this.informTree("ExpanderPressed", false);
};
/**
* The event is fired when the right arrow key is pressed.
*
* @param {jQuery.Event} oEvent The event object.
*/
TreeItemBase.prototype.onsapright = function(oEvent) {
if (oEvent.srcControl !== this || this.isLeaf()) {
return;
}
if (!this.getExpanded()) {
this.informTree("ExpanderPressed", true);
} else {
// Change the keyCode so that the item navigation handles the down navigation.
oEvent.keyCode = KeyCodes.ARROW_DOWN;
}
};
/**
* The event is fired when the left arrow key is pressed.
*
* @param {jQuery.Event} oEvent The event object.
*/
TreeItemBase.prototype.onsapleft = function(oEvent) {
if (oEvent.srcControl !== this || this.isTopLevel() && !this.getExpanded()) {
return;
}
if (!this.isLeaf()) {
if (this.getExpanded()) {
this.informTree("ExpanderPressed", false);
} else {
this.getParentNode().focus();
}
} else {
this.getParentNode().focus();
}
};
/**
* The event is fired when the backspace key is pressed.
*
* @param {jQuery.Event} oEvent The event object.
*/
TreeItemBase.prototype.onsapbackspace = function(oEvent) {
// Only set focus on parent when the event is fired by item itself.
// Prevent miss-set when the content of CustomTreeItem fires event.
if (oEvent.srcControl !== this) {
return;
}
if (!this.isTopLevel()) {
this.getParentNode().focus();
}
};
TreeItemBase.prototype.getAccessibilityType = function(oBundle) {
return oBundle.getText("ACC_CTR_TYPE_TREEITEM");
};
TreeItemBase.prototype.exit = function() {
ListItemBase.prototype.exit.apply(this, arguments);
this.destroyControls(["Expander"]);
};
TreeItemBase.prototype.onlongdragover = function(oEvent) {
this.informTree("LongDragOver");
};
TreeItemBase.prototype._getTreeBindingProxy = function() {
var oTree = this.getTree();
if (oTree) {
return oTree._oProxy;
}
};
return TreeItemBase;
});