UNPKG

@openui5/sap.m

Version:

OpenUI5 UI Library sap.m

292 lines (272 loc) 8.25 kB
/*! * OpenUI5 * (c) Copyright 2009-2023 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ sap.ui.define([ "sap/ui/core/Control", "sap/m/Page" ], function (Control, Page) { "use strict"; /** * Constructor for a new <code>AbstractContainer</code>. * * @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>AbstractContainer</code> control can be used to define a fixed header and footer area while offering the possibility * to define various controls as content, which can be dynamically added, removed, and switched. * * @extends sap.ui.core.Control * * @author SAP SE * @version 1.117.4 * * @constructor * @alias sap.m.p13n.AbstractContainer * @author SAP SE * @version 1.117.4 * @since 1.96 * * @private * @ui5-restricted */ var AbstractContainer = Control.extend("sap.m.p13n.AbstractContainer", { metadata: { library: "sap.m", defaultAggregation: "views", properties: { /** * Defines the default view for the <code>AbstractContainer</code> content area. */ defaultView: { type: "string" } }, aggregations: { /** * Defines the content for the <code>AbstractContainer</code> header area. */ header: { type: "sap.m.IBar", multiple: false, forwarding: { idSuffix: "-AbstractContainer", aggregation: "customHeader", forwardBinding: true } }, /** * Defines the content for the <code>AbstractContainer</code> <code>subHeader</code> area. */ subHeader: { type: "sap.m.IBar", multiple: false, forwarding: { idSuffix: "-AbstractContainer", aggregation: "subHeader", forwardBinding: true } }, /** * Defines the content for the <code>AbstractContainer</code> footer area. */ footer: { type: "sap.m.IBar", multiple: false, forwarding: { idSuffix: "-AbstractContainer", aggregation: "footer", forwardBinding: true } }, /** * Defines the different content views for the <code>AbstractContainer</code> content area. */ views: { type: "sap.m.p13n.AbstractContainerItem", multiple: true }, /** * Inner <code>sap.m.Page</code> as basic layout control. */ _content: { type: "sap.ui.core.Control", multiple: false, visibility: "hidden" } }, events: { /** * This event will be fired before a view is switched. */ beforeViewSwitch: { allowPreventDefault: true, parameters: { /** * This parameter is the current view. */ source: {type: "string"}, /** * This parameter is the target view. */ target: {type: "string"} } }, /** * This event will be fired after a view is switched. */ afterViewSwitch: { allowPreventDefault: true, parameters: { /** * This parameter is the current view. */ source: {type: "string"}, /** * This parameter is the target view. */ target: {type: "string"} } } } }, renderer: { apiVersion: 2, render: function(oRm, oControl) { oRm.openStart("div", oControl); oRm.style("height", "100%"); oRm.openEnd(); oRm.renderControl(oControl.getAggregation("_content")); oRm.close("div"); } } }); AbstractContainer.prototype.init = function() { Control.prototype.init.apply(this, arguments); this.addStyleClass("sapMAbstractContainer"); this._initializeContent(); }; AbstractContainer.prototype.applySettings = function() { Control.prototype.applySettings.apply(this, arguments); this.switchView(this.getDefaultView()); return this; }; AbstractContainer.prototype._initializeContent = function() { this.oLayout = new Page(this.getId() + "-AbstractContainer"); this.setAggregation("_content", this.oLayout); }; /** * This method can be used to remove a view from the <code>AbstractContainer</code> instance. * * @param {string|sap.m.p13n.AbstractContainerItem} vContainerItem View that is removed * @param {boolean} bSuppress Suppress invalidate * * @returns {this} The <code>AbstractContainer<code> instance */ AbstractContainer.prototype.removeView = function(vContainerItem, bSuppress){ var oContainerItem = typeof vContainerItem == "string" ? this.getView(vContainerItem) : vContainerItem; oContainerItem = this.removeAggregation("views", oContainerItem , bSuppress); //In case the currently selected view has been removed, switch the view if (oContainerItem && oContainerItem.getKey() === this.getCurrentViewKey()){ this.switchView(); } return this; }; /** * This method can be used to add a view to the <code>AbstractContainer</code> instance. * * @param {sap.m.p13n.AbstractContainerItem} vContainerItem <code>AbstractContainerItem</code> that is added * * @returns {this} The <code>AbstractContainer<code> instance */ AbstractContainer.prototype.addView = function(vContainerItem) { if (vContainerItem && vContainerItem.getContent() && !vContainerItem.getContent().hasStyleClass("sapUiMAbstractContainerContent")){ vContainerItem.getContent().addStyleClass("sapUiMAbstractContainerContent"); } this.addAggregation("views", vContainerItem); return this; }; /** * This method can be used to retrieve the key of the current view. * * @returns {string} The key of the currently visible view in the content area */ AbstractContainer.prototype.getCurrentViewKey = function() { return this._sCurrentView ? this._sCurrentView : this.getDefaultView(); }; /** * This method can be used to retrieve the content of the current view. * * @returns {sap.ui.core.Control} The content of the currently visible view in the content area */ AbstractContainer.prototype.getCurrentViewContent = function() { return this.getView(this.getCurrentViewKey()).getContent(); }; /** * This method can be used to switch to an existing view using the related <code>ContainerItem</code> key. * * @param {string} sKey The key of the ContainerItem whose content is made visible next */ AbstractContainer.prototype.switchView = function(sKey) { var oNewView = this.getView(sKey); if (!oNewView) { oNewView = this.getViews()[0]; if (!oNewView) { return; } } if (!this.fireBeforeViewSwitch({source: sCurrentViewKey, target: sKey})) { this._bPrevented = true; return; // view switch event was prevented by event handler. } this._bPrevented = false; var sCurrentViewKey = this.getCurrentViewKey(); this._sCurrentView = oNewView.getKey(); this.oLayout.removeAllContent(); this.oLayout.addContent(oNewView.getContent()); if (sCurrentViewKey !== sKey) { this.oAfterRenderingDelegate = { onAfterRendering: function () { this.removeEventDelegate(this.oAfterRenderingDelegate); this.fireAfterViewSwitch({source: sCurrentViewKey, target: sKey}); }.bind(this) }; this.addEventDelegate(this.oAfterRenderingDelegate, this); } }; /** * This method can be used to retrieve the current view by using the related <code>ContainerItem</code> key. * * @param {string|sap.ui.core.Control} vView The key or the content of the ContainerItem which is retrieved * * @returns {sap.m.p13n.AbstractContainerItem} The matching ContainerItem */ AbstractContainer.prototype.getView = function(vView) { return this.getViews().find(function(oView){ if (oView.getKey() === vView || oView.getContent() === vView) { return oView; } }); }; /** * Gets a plain representation of the current views. * * @returns {object} The current view aggregation as map */ AbstractContainer.prototype.getViewMap = function() { return this.getViews().map(function(o){ return { key: o.getKey(), content: o.getContent() }; }); }; AbstractContainer.prototype.exit = function() { Control.prototype.exit.apply(this, arguments); this._sCurrentView = null; this.oResourceBundle = null; }; return AbstractContainer; });