@openui5/sap.ui.core
Version:
OpenUI5 Core Library sap.ui.core
556 lines (491 loc) • 15 kB
JavaScript
// valid-jsdoc disabled because this check is validating just the params and return statement and those are all inherited from BaseTreeModifier.
/* eslint-disable valid-jsdoc */
/*!
* OpenUI5
* (c) Copyright 2009-2021 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
sap.ui.define([
"sap/ui/base/BindingParser",
"./BaseTreeModifier",
"./XmlTreeModifier",
"sap/base/util/ObjectPath",
"sap/ui/util/XMLHelper",
"sap/base/util/merge",
"sap/ui/core/Fragment" // also needed to have sap.ui.xmlfragment
], function (
BindingParser,
BaseTreeModifier,
XmlTreeModifier,
ObjectPath,
XMLHelper,
merge,
Fragment
) {
"use strict";
/**
* Static utility class to access ManagedObjects in a harmonized way with XMLNodes.
*
* @namespace sap.ui.core.util.reflection.JsControlTreeModifier
* @extends sap.ui.core.util.reflection.BaseTreeModifier
* @private
* @ui5-restricted
* @since 1.56.0
*/
var JsControlTreeModifier = /** @lends sap.ui.core.util.reflection.JsControlTreeModifier */ {
targets: "jsControlTree",
/**
* @inheritDoc
*/
setVisible: function (oControl, bVisible) {
if (oControl.setVisible) {
this.unbindProperty(oControl, "visible");
oControl.setVisible(bVisible);
} else {
throw new Error("Provided control instance has no setVisible method");
}
},
/**
* @inheritDoc
*/
getVisible: function (oControl) {
if (oControl.getVisible) {
return oControl.getVisible();
} else {
throw new Error("Provided control instance has no getVisible method");
}
},
/**
* @inheritDoc
*/
setStashed: function (oControl, bStashed) {
bStashed = !!bStashed;
if (oControl.unstash) {
// check if the control is stashed and should be unstashed
if (oControl.isStashed() === true && bStashed === false) {
oControl = oControl.unstash();
}
// ensure original control's visible property is set
if (oControl.setVisible) {
this.setVisible(oControl, !bStashed);
}
return oControl;
} else {
throw new Error("Provided control instance has no unstash method");
}
},
/**
* @inheritDoc
*/
getStashed: function (oControl) {
if (oControl.isStashed) {
return oControl.isStashed() ? oControl.isStashed() : !this.getVisible(oControl);
}
throw new Error("Provided control instance has no isStashed method");
},
/**
* @inheritDoc
*/
bindProperty: function (oControl, sPropertyName, vBindingInfos) {
oControl.bindProperty(sPropertyName, vBindingInfos);
},
/**
* @inheritDoc
*/
unbindProperty: function (oControl, sPropertyName) {
if (oControl) {
oControl.unbindProperty(sPropertyName, /*bSuppressReset = */true);
}
},
/**
* @inheritDoc
*/
setProperty: function (oControl, sPropertyName, vPropertyValue) {
var oMetadata = oControl.getMetadata().getPropertyLikeSetting(sPropertyName);
var oBindingParserResult;
var bError;
this.unbindProperty(oControl, sPropertyName);
try {
oBindingParserResult = BindingParser.complexParser(vPropertyValue, undefined, true);
} catch (error) {
bError = true;
}
//For compatibility with XMLTreeModifier the value should be serializable
if (oMetadata) {
if (this._isSerializable(vPropertyValue)) {
if (oBindingParserResult && typeof oBindingParserResult === "object" || bError) {
vPropertyValue = this._escapeCurlyBracketsInString(vPropertyValue);
}
var sPropertySetter = oMetadata._sMutator;
oControl[sPropertySetter](vPropertyValue);
} else {
throw new TypeError("Value cannot be stringified", "sap.ui.core.util.reflection.JsControlTreeModifier");
}
}
},
/**
* @inheritDoc
*/
getProperty: function (oControl, sPropertyName) {
var oMetadata = oControl.getMetadata().getPropertyLikeSetting(sPropertyName);
if (oMetadata) {
var sPropertyGetter = oMetadata._sGetter;
return oControl[sPropertyGetter]();
}
},
/**
* @inheritDoc
*/
isPropertyInitial: function (oControl, sPropertyName) {
return oControl.isPropertyInitial(sPropertyName);
},
/**
* @inheritDoc
*/
setPropertyBinding: function (oControl, sPropertyName, oPropertyBinding) {
this.unbindProperty(oControl, sPropertyName);
var mSettings = {};
mSettings[sPropertyName] = oPropertyBinding;
oControl.applySettings(mSettings);
},
/**
* @inheritDoc
*/
getPropertyBinding: function (oControl, sPropertyName) {
return oControl.getBindingInfo(sPropertyName);
},
/**
* @inheritDoc
*/
createAndAddCustomData: function(oControl, sCustomDataKey, sValue, oAppComponent) {
var oCustomData = this.createControl("sap.ui.core.CustomData", oAppComponent);
this.setProperty(oCustomData, "key", sCustomDataKey);
this.setProperty(oCustomData, "value", sValue);
this.insertAggregation(oControl, "customData", oCustomData, 0);
},
/**
* @inheritDoc
*/
createControl: function (sClassName, oAppComponent, oView, oSelector, mSettings, bAsync) {
var sErrorMessage;
if (this.bySelector(oSelector, oAppComponent)) {
sErrorMessage = "Can't create a control with duplicated ID " + (oSelector.id || oSelector);
if (bAsync) {
return Promise.reject(sErrorMessage);
}
throw new Error(sErrorMessage);
}
if (bAsync) {
return new Promise(function(fnResolve, fnReject) {
sap.ui.require([sClassName.replace(/\./g,"/")],
function(ClassObject) {
var sId = this.getControlIdBySelector(oSelector, oAppComponent);
fnResolve(new ClassObject(sId, mSettings));
}.bind(this),
function() {
fnReject(new Error("Required control '" + sClassName + "' couldn't be created asynchronously"));
}
);
}.bind(this));
}
// in the synchronous case, object should already be preloaded
var ClassObject = ObjectPath.get(sClassName);
if (!ClassObject) {
throw new Error("Can't create a control because the matching class object has not yet been loaded. Please preload the '" + sClassName + "' module");
}
var sId = this.getControlIdBySelector(oSelector, oAppComponent);
return new ClassObject(sId, mSettings);
},
/**
* @inheritDoc
*/
applySettings: function(oControl, mSettings) {
oControl.applySettings(mSettings);
},
/**
* @inheritDoc
*/
_byId: function (sId) {
return sap.ui.getCore().byId(sId);
},
/**
* @inheritDoc
*/
getId: function (oControl) {
return oControl.getId();
},
/**
* @inheritDoc
*/
getParent: function (oControl) {
return oControl.getParent && oControl.getParent();
},
/**
* @inheritDoc
*/
getControlMetadata: function (oControl) {
return oControl && oControl.getMetadata();
},
/**
* @inheritDoc
*/
getControlType: function (oControl) {
return oControl && oControl.getMetadata().getName();
},
/**
* @inheritDoc
*/
setAssociation: function (vParent, sName, sId) {
var oMetadata = vParent.getMetadata().getAssociation(sName);
oMetadata.set(vParent, sId);
},
/**
* @inheritDoc
*/
getAssociation: function (vParent, sName) {
var oMetadata = vParent.getMetadata().getAssociation(sName);
return oMetadata.get(vParent);
},
/**
* @inheritDoc
*/
getAllAggregations: function (oParent) {
return oParent.getMetadata().getAllAggregations();
},
/**
* @inheritDoc
*/
getAggregation: function (oParent, sName) {
var oAggregation = this.findAggregation(oParent, sName);
if (oAggregation) {
return oParent[oAggregation._sGetter]();
}
},
/**
* @inheritDoc
*/
insertAggregation: function (oParent, sName, oObject, iIndex) {
//special handling without invalidation for customData
if ( sName === "customData"){
oParent.insertAggregation(sName, oObject, iIndex, /*bSuppressInvalidate=*/true);
} else {
var oAggregation = this.findAggregation(oParent, sName);
if (oAggregation) {
if (oAggregation.multiple) {
var iInsertIndex = iIndex || 0;
oParent[oAggregation._sInsertMutator](oObject, iInsertIndex);
} else {
oParent[oAggregation._sMutator](oObject);
}
}
}
},
/**
* @inheritDoc
*/
removeAggregation: function (oControl, sName, oObject) {
//special handling without invalidation for customData
if ( sName === "customData"){
oControl.removeAggregation(sName, oObject, /*bSuppressInvalidate=*/true);
} else {
var oAggregation = this.findAggregation(oControl, sName);
if (oAggregation) {
oControl[oAggregation._sRemoveMutator](oObject);
}
}
},
/**
* @inheritDoc
*/
removeAllAggregation: function (oControl, sName) {
//special handling without invalidation for customData
if ( sName === "customData"){
oControl.removeAllAggregation(sName, /*bSuppressInvalidate=*/true);
} else {
var oAggregation = this.findAggregation(oControl, sName);
if (oAggregation) {
oControl[oAggregation._sRemoveAllMutator]();
}
}
},
/**
* @inheritDoc
*/
getBindingTemplate: function (oControl, sAggregationName) {
var oBinding = oControl.getBindingInfo(sAggregationName);
return oBinding && oBinding.template;
},
/**
* @inheritDoc
*/
updateAggregation: function (oControl, sAggregationName) {
var oAggregation = this.findAggregation(oControl, sAggregationName);
if (oAggregation && oControl.getBinding(sAggregationName)) {
oControl[oAggregation._sDestructor]();
oControl.updateAggregation(sAggregationName);
}
},
/**
* @inheritDoc
*/
findIndexInParentAggregation: function(oControl) {
var oParent = this.getParent(oControl),
aControlsInAggregation;
if (!oParent) {
return -1;
}
// we need all controls in the aggregation
aControlsInAggregation = this.getAggregation(oParent, this.getParentAggregationName(oControl));
// if aControls is an array:
if (Array.isArray(aControlsInAggregation)) {
// then the aggregtion is multiple and we can find the index of
// oControl in the array
return aControlsInAggregation.indexOf(oControl);
} else {
// if aControlsInAggregation is not an array, then the aggregation is
// of type 0..1 and aControlsInAggregation is the oControl provided
// to the function initially, so its index is 0
return 0;
}
},
/**
* @inheritDoc
*/
getParentAggregationName: function (oControl) {
return oControl.sParentAggregationName;
},
/**
* @inheritDoc
*/
findAggregation: function(oControl, sAggregationName) {
if (oControl) {
if (oControl.getMetadata) {
var oMetadata = oControl.getMetadata();
var oAggregations = oMetadata.getAllAggregations();
if (oAggregations) {
return oAggregations[sAggregationName];
}
}
}
},
/**
* @inheritDoc
*/
validateType: function(oControl, oAggregationMetadata, oParent, sFragment) {
var sTypeOrInterface = oAggregationMetadata.type;
// if aggregation is not multiple and already has element inside, then it is not valid for element
if (oAggregationMetadata.multiple === false && this.getAggregation(oParent, oAggregationMetadata.name) &&
this.getAggregation(oParent, oAggregationMetadata.name).length > 0) {
return false;
}
return oControl.isA(sTypeOrInterface);
},
/**
* @inheritDoc
*/
instantiateFragment: function(sFragment, sNamespace, oView) {
var oFragment = XMLHelper.parse(sFragment);
oFragment = this._checkAndPrefixIdsInFragment(oFragment, sNamespace);
var aNewControls;
var sId = oView && oView.getId();
var oController = oView.getController();
aNewControls = sap.ui.xmlfragment({
fragmentContent: oFragment,
sId:sId
}, oController);
if (!Array.isArray(aNewControls)) {
aNewControls = [aNewControls];
}
return aNewControls;
},
/**
* @inheritDoc
*/
templateControlFragment: function(sFragmentName, mPreprocessorSettings, oView) {
return BaseTreeModifier._templateFragment(
sFragmentName,
mPreprocessorSettings
).then(function(oFragment) {
var oController = (oView && oView.getController()) || undefined;
return Fragment.load({
definition: oFragment,
controller: oController
});
});
},
/**
* @inheritDoc
*/
destroy: function(oControl, bSuppressInvalidate) {
oControl.destroy(bSuppressInvalidate);
},
_getFlexCustomData: function(oControl, sType) {
var oCustomData = typeof oControl === "object"
&& typeof oControl.data === "function"
&& oControl.data("sap-ui-custom-settings");
return ObjectPath.get(["sap.ui.fl", sType], oCustomData);
},
/**
* @inheritDoc
*/
attachEvent: function (oObject, sEventName, sFunctionPath, vData) {
var fnCallback = ObjectPath.get(sFunctionPath);
if (typeof fnCallback !== "function") {
throw new Error("Can't attach event because the event handler function is not found or not a function.");
}
oObject.attachEvent(sEventName, vData, fnCallback);
},
/**
* @inheritDoc
*/
detachEvent: function (oObject, sEventName, sFunctionPath) {
var fnCallback = ObjectPath.get(sFunctionPath);
if (typeof fnCallback !== "function") {
throw new Error("Can't attach event because the event handler function is not found or not a function.");
}
// EventProvider.detachEvent doesn't accept vData parameter, therefore it might lead
// to a situation when an incorrect event listener is detached.
oObject.detachEvent(sEventName, fnCallback);
},
/**
* @inheritDoc
*/
bindAggregation: function (oControl, sAggregationName, oBindingInfo) {
oControl.bindAggregation(sAggregationName, oBindingInfo);
},
/**
* @inheritDoc
*/
unbindAggregation: function (oControl, sAggregationName) {
// bSuppressReset is not supported
oControl.unbindAggregation(sAggregationName);
},
/**
* @inheritDoc
*/
getExtensionPointInfo: function(sExtensionPointName, oView) {
var oViewNode = (oView._xContent) ? oView._xContent : oView;
var oExtensionPointInfo = XmlTreeModifier.getExtensionPointInfo(sExtensionPointName, oViewNode);
if (oExtensionPointInfo) {
// decrease the index by 1 to get the index of the extension point itself for js-case
oExtensionPointInfo.index--;
oExtensionPointInfo.parent = oExtensionPointInfo.parent && this._byId(oView.createId(oExtensionPointInfo.parent.getAttribute("id")));
oExtensionPointInfo.defaultContent = oExtensionPointInfo.defaultContent
.map(function (oNode) {
var sId = oView.createId(oNode.getAttribute("id"));
return this._byId(sId);
}.bind(this))
.filter(function (oControl) {
return !!oControl;
});
}
return oExtensionPointInfo;
}
};
return merge(
{} /* target object, to avoid changing of original modifier */,
BaseTreeModifier,
JsControlTreeModifier
);
},
/* bExport= */true);