@openui5/sap.ui.core
Version:
OpenUI5 Core Library sap.ui.core
263 lines (253 loc) • 8.97 kB
JavaScript
/*!
* OpenUI5
* (c) Copyright 2026 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
/*eslint-disable max-len */
// Provides class sap.ui.model.TreeBindingCompatibilityAdapter
sap.ui.define(["sap/base/util/each"],
function(each) {
"use strict";
/**
* Adapter for {@link sap.ui.model.odata.ODataTreeBinding} to add the list binding functionality and use the
* tree structure in list based controls.
*
* @param {sap.ui.model.TreeBinding} oBinding
* The binding to add ListBinding functionality to
* @param {object} oControl
* The tree or tree table control using the given binding; the control is used for
* selection handling
*
* @alias sap.ui.model.TreeBindingCompatibilityAdapter
* @namespace
*
* @private
* @ui5-restricted sap.m.Tree, sap.ui.table.TreeTable
*
* @deprecated since 1.96.0; use {@link sap.ui.model.TreeBindingAdapter} instead
*/
var TreeBindingCompatibilityAdapter = function (oBinding, oControl) {
// Code necessary for ClientTreeBinding
Object.assign(oBinding, {
_init: function(bExpandFirstLevel) {
this._bExpandFirstLevel = bExpandFirstLevel;
// load the root contexts and create the context info map
this.mContextInfo = {};
this._initContexts();
// expand the first level if required
if (bExpandFirstLevel && !this._bFirstLevelExpanded) {
this._expandFirstLevel();
}
},
_initContexts: function(bSkipFirstLevelLoad) {
// load the root contexts and create the context info map entry (if missing)
this.aContexts = this.getRootContexts(0, Number.MAX_VALUE);
for (var i = 0, l = this.aContexts.length; i < l; i++) {
var oldContextInfo = this._getContextInfo(this.aContexts[i]);
this._setContextInfo({
oContext: this.aContexts[i],
iLevel: 0,
bExpanded: oldContextInfo ? oldContextInfo.bExpanded : false
});
}
if (this._bExpandFirstLevel && !this._bFirstLevelExpanded) {
this._expandFirstLevel(bSkipFirstLevelLoad);
}
},
_expandFirstLevel: function (bSkipFirstLevelLoad) {
var that = this;
if (this.aContexts && this.aContexts.length > 0) {
each(this.aContexts.slice(), function(iIndex, oContext) {
if (!bSkipFirstLevelLoad) {
that._loadChildContexts(oContext);
}
that._getContextInfo(oContext).bExpanded = true;
});
this._bFirstLevelExpanded = true;
}
},
_fnFireFilter: oBinding._fireFilter,
_fireFilter: function() {
this._fnFireFilter.apply(this, arguments);
this._initContexts(true);
this._restoreContexts(this.aContexts);
},
_fnFireChange: oBinding._fireChange,
_fireChange: function() {
this._fnFireChange.apply(this, arguments);
this._initContexts(true);
this._restoreContexts(this.aContexts);
},
_restoreContexts: function(aContexts) {
var that = this;
var aNewChildContexts = [];
each(aContexts.slice(), function(iIndex, oContext) {
var oContextInfo = that._getContextInfo(oContext);
if (oContextInfo && oContextInfo.bExpanded) {
aNewChildContexts.push.apply(aNewChildContexts, that._loadChildContexts(oContext));
}
});
if (aNewChildContexts.length > 0) {
this._restoreContexts(aNewChildContexts);
}
},
_loadChildContexts: function(oContext) {
var oContextInfo = this._getContextInfo(oContext);
var iIndex = (this.aContexts ? this.aContexts.indexOf(oContext) : -1);
var aNodeContexts = this.getNodeContexts(oContext, 0, Number.MAX_VALUE);
for (var i = 0, l = aNodeContexts.length; i < l; i++) {
this.aContexts.splice(iIndex + i + 1, 0, aNodeContexts[i]);
var oldContextInfo = this._getContextInfo(aNodeContexts[i]);
this._setContextInfo({
oParentContext: oContext,
oContext: aNodeContexts[i],
iLevel: oContextInfo.iLevel + 1,
bExpanded: oldContextInfo ? oldContextInfo.bExpanded : false
});
}
return aNodeContexts;
},
_getContextInfo: function(oContext) {
return oContext ? this.mContextInfo[oContext.getPath()] : undefined;
},
_setContextInfo: function(mData) {
if (mData && mData.oContext) {
this.mContextInfo[mData.oContext.getPath()] = mData;
}
},
getLength: function() {
return this.aContexts ? this.aContexts.length : 0;
},
getContexts: function(iStartIndex, iLength) {
return this.aContexts.slice(iStartIndex, iStartIndex + iLength);
},
getNodes: function(iStartIndex, iLength) {
var aContexts = this.getContexts(iStartIndex, iStartIndex + iLength);
//wrap contexts into node objects
var aNodes = [];
for (var i = 0; i < aContexts.length; i++) {
var oContextInfo = this._getContextInfo(aContexts[i]) || {}; //empty object to make sure this does not break
var oContext = aContexts[i];
aNodes.push({
context: oContext,
level: oContextInfo.iLevel,
parent: oContextInfo.oParentContext,
nodeState: {
expanded: oContextInfo.bExpanded,
collapsed: !oContextInfo.bExpanded,
selected: false //default should be false, correct value is given via the selection model
}
});
}
return aNodes;
},
hasChildren: function() {
return true;
},
nodeHasChildren: function() {
return true;
},
getContextByIndex: function (iRowIndex) {
return this.aContexts[iRowIndex];
},
getLevel: function(oContext) {
var oContextInfo = this._getContextInfo(oContext);
return oContextInfo ? oContextInfo.iLevel : -1;
},
isExpanded: function(iRowIndex) {
var oContext = this.getContextByIndex(iRowIndex);
var oContextInfo = this._getContextInfo(oContext);
return oContextInfo ? oContextInfo.bExpanded : false;
},
expandContext: function(oContext) {
var oContextInfo = this._getContextInfo(oContext);
if (oContextInfo && !oContextInfo.bExpanded) {
this.storeSelection();
this._loadChildContexts(oContext);
oContextInfo.bExpanded = true;
this._fireChange();
this.restoreSelection();
}
},
expand: function (iRowIndex) {
this.expandContext(this.getContextByIndex(iRowIndex));
},
collapseContext: function(oContext, bSupressChanges) {
var oContextInfo = this._getContextInfo(oContext);
if (oContextInfo && oContextInfo.bExpanded) {
this.storeSelection();
for (var i = this.aContexts.length - 1; i > 0; i--) {
if (this._getContextInfo(this.aContexts[i]).oParentContext === oContext) {
this.aContexts.splice(i, 1);
}
}
oContextInfo.bExpanded = false;
if (!bSupressChanges) {
this._fireChange();
}
this.restoreSelection();
}
},
collapse: function (iRowIndex) {
this.collapseContext(this.getContextByIndex(iRowIndex));
},
collapseToLevel: function (iLevel) {
if (!iLevel || iLevel < 0) {
iLevel = 0;
}
var aContextsCopy = this.aContexts.slice();
for (var i = aContextsCopy.length - 1; i >= 0; i--) {
var iContextLevel = this.getLevel(aContextsCopy[i]);
if (iContextLevel != -1 && iContextLevel >= iLevel) {
this.collapseContext(aContextsCopy[i], true);
}
}
this._fireChange();
},
toggleContext: function(oContext) {
var oContextInfo = this._getContextInfo(oContext);
if (oContextInfo) {
if (oContextInfo.bExpanded) {
this.collapseContext(oContext);
} else {
this.expandContext(oContext);
}
}
},
toggleIndex: function (iRowIndex) {
this.toggleContext(this.getContextByIndex(iRowIndex));
},
storeSelection: function() {
var aSelectedIndices = oControl.getSelectedIndices();
var aSelectedContexts = [];
each(aSelectedIndices, function(iIndex, iValue) {
aSelectedContexts.push(oControl.getContextByIndex(iValue));
});
this._aSelectedContexts = aSelectedContexts;
},
restoreSelection: function() {
oControl.clearSelection();
var _aSelectedContexts = this._aSelectedContexts;
each(this.aContexts, function(iIndex, oContext) {
if (((_aSelectedContexts ? _aSelectedContexts.indexOf(oContext) : -1)) >= 0) {
oControl.addSelectionInterval(iIndex, iIndex);
}
});
this._aSelectedContexts = undefined;
},
attachSelectionChanged: function() {
// for compatibility reasons (OData Tree Binding)
return undefined;
},
detachSelectionChanged: function() {}, // for compatibility
clearSelection: function () {
oControl._oSelection.clearSelection();
},
attachSort: function() {},
detachSort: function() {}
});
// initialize the binding
oBinding._init(oControl.getExpandFirstLevel());
};
return TreeBindingCompatibilityAdapter;
}, true);