/*! * UI development toolkit for HTML5 (OpenUI5) * (c) Copyright 2009-2018 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ // Provides control sap.ui.commons.ResponsiveContainer. sap.ui.define([ 'jquery.sap.global', './library', 'sap/ui/core/Control', 'sap/ui/core/ResizeHandler', "./ResponsiveContainerRenderer" ], function(jQuery, library, Control, ResizeHandler, ResponsiveContainerRenderer) { "use strict"; /** * Constructor for a new ResponsiveContainer. * * @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 * Is used to provide a container, which can show different content depending on its current width. It fires an event, whenever a new range is reached. In addition the content of the new range is automatically shown, if it is set. * @extends sap.ui.core.Control * * @author SAP SE * @version 1.60.23 * * @constructor * @public * @deprecated as of version 1.38. Use a container by choice from the {@link sap.m} library, instead. * @alias sap.ui.commons.ResponsiveContainer * @ui5-metamodel This control/element also will be described in the UI5 (legacy) designtime metamodel */ var ResponsiveContainer = Control.extend("sap.ui.commons.ResponsiveContainer", /** @lends sap.ui.commons.ResponsiveContainer.prototype */ { metadata : { library : "sap.ui.commons", properties : { /** * The width of the responsive container. */ width : {type : "sap.ui.core.CSSSize", group : "Dimension", defaultValue : '100%'}, /** * The width of the responsive container. */ height : {type : "sap.ui.core.CSSSize", group : "Dimension", defaultValue : '100%'} }, aggregations : { /** * The ranges defined for this container */ ranges : {type : "sap.ui.commons.ResponsiveContainerRange", multiple : true, singularName : "range"}, /** * The currently shown content, either the default content or content of a range */ content : {type : "sap.ui.core.Control", multiple : false, visibility : "hidden"} }, associations : { /** * The default content to show, in case the range does not provide content */ defaultContent : {type : "sap.ui.core.Control", multiple : false} }, events : { /** * The event is fired the width of the container reaches a new range. */ rangeSwitch : { parameters : { /** * The current range */ currentRange : {type : "sap.ui.commons.ResponsiveContainerRange"} } } } }}); /** * Control Initialization * @private */ ResponsiveContainer.prototype.init = function(){ this.oCurrentRange = null; }; /** * Destructor * @private */ ResponsiveContainer.prototype.exit = function (){ // Cleanup resize event registration on exit if (this.sResizeListenerId) { ResizeHandler.deregister(this.sResizeListenerId); this.sResizeListenerId = null; } }; /** * Before rendering */ ResponsiveContainer.prototype.onBeforeRendering = function() { // Cleanup resize event registration before re-rendering if (this.sResizeListenerId) { ResizeHandler.deregister(this.sResizeListenerId); this.sResizeListenerId = null; } if (!this.getAggregation("content")) { var oDefaultContent = sap.ui.getCore().byId(this.getDefaultContent()); this.setAggregation("content", oDefaultContent); } }; /** * After rendering */ ResponsiveContainer.prototype.onAfterRendering = function() { var fnResizeHandler = jQuery.proxy(this.onresize, this); this.sResizeListenerId = ResizeHandler.register(this.getDomRef(), fnResizeHandler); this.refreshRangeDimensions(); if (!this.oCurrentRange) { setTimeout(fnResizeHandler, 0); } }; /** * Resize handling. * @param {jQuery.Event} oEvent The fired event */ ResponsiveContainer.prototype.onresize = function(oEvent) { var oRange = this.findMatchingRange(), sContentId = oRange && oRange.getContent(), oNewContent; if (this.oCurrentRange != oRange) { this.oCurrentRange = oRange; if (!oRange) { sContentId = this.getDefaultContent(); } oNewContent = sap.ui.getCore().byId(sContentId); this.setAggregation("content", oNewContent); this.fireRangeSwitch({ currentRange: this.oCurrentRange }); } }; /** * Refresh ranges, updates the range sizes from the DOM. * Loop through all the rendered divs for the ranges and read their width and height * for later comparison with the current container size */ ResponsiveContainer.prototype.refreshRangeDimensions = function() { var aRanges = this.getRanges(), aRangeDimensions = [], $Range; jQuery.each(aRanges, function(i, oRange) { $Range = oRange.$(); aRangeDimensions.push({ range: oRange, width: $Range.width(), height: $Range.height() }); }); this.aRangeDimensions = aRangeDimensions; }; /** * Find best matching range, finds the range which best fills the available space. * Reads the current width and height of the container and compares to the stored range * dimensions to find the best match. */ ResponsiveContainer.prototype.findMatchingRange = function() { var $Container = this.$(), iWidth = $Container.width(), iHeight = $Container.height(), iRangeWidth, iRangeHeight, aRangeDimensions = this.aRangeDimensions, oMatch = null; jQuery.each(aRangeDimensions, function(i, oRangeDim) { iRangeWidth = oRangeDim.width || iWidth; iRangeHeight = oRangeDim.height || iHeight; if (iRangeWidth <= iWidth && iRangeHeight <= iHeight) { oRangeDim.area = iRangeWidth * iRangeHeight; if (!oMatch || oMatch.area < oRangeDim.area) { oMatch = oRangeDim; } } }); return oMatch && oMatch.range; }; return ResponsiveContainer; }, /* bExport= */ true);