/*!
* 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.
*/
sap.ui.define(['./FlexBoxCssPropertyMap', 'sap/ui/Device'],
function(FlexBoxCssPropertyMap, Device) {
"use strict";
/**
* FlexBox styling helper
* @namespace
*/
var FlexBoxStylingHelper = {};
/**
* Goes through applicable item styles and sets them on the given control.
*
* @param {sap.ui.core.RenderManager} oRm the RenderManager that can be used for writing to the render output buffer
* @param {sap.m.FlexItemData} oLayoutData an object representation of the layout data
*/
FlexBoxStylingHelper.setFlexItemStyles = function(oRm, oLayoutData) {
oRm = oRm || null;
var sOrder = '' + oLayoutData.getOrder(),
sGrowFactor = '' + oLayoutData.getGrowFactor(),
sShrinkFactor = '' + oLayoutData.getShrinkFactor(),
sBaseSize = oLayoutData.getBaseSize().toLowerCase(),
sMinHeight = oLayoutData.getMinHeight(),
sMaxHeight = oLayoutData.getMaxHeight(),
sMinWidth = oLayoutData.getMinWidth(),
sMaxWidth = oLayoutData.getMaxWidth();
// Set values if different from default
if (typeof sOrder !== 'undefined') {
FlexBoxStylingHelper.setStyle(oRm, oLayoutData, "order", sOrder);
}
if (typeof sGrowFactor !== 'undefined') {
FlexBoxStylingHelper.setStyle(oRm, oLayoutData, "flex-grow", sGrowFactor);
}
if (typeof sShrinkFactor !== 'undefined') {
FlexBoxStylingHelper.setStyle(oRm, oLayoutData, "flex-shrink", sShrinkFactor);
}
if (typeof sBaseSize !== 'undefined') {
FlexBoxStylingHelper.setStyle(oRm, oLayoutData, "flex-basis", sBaseSize);
}
if (typeof sMinHeight !== 'undefined') {
FlexBoxStylingHelper.setStyle(oRm, oLayoutData, "min-height", sMinHeight);
}
if (typeof sMaxHeight !== 'undefined') {
FlexBoxStylingHelper.setStyle(oRm, oLayoutData, "max-height", sMaxHeight);
}
if (typeof sMinWidth !== 'undefined') {
FlexBoxStylingHelper.setStyle(oRm, oLayoutData, "min-width", sMinWidth);
}
if (typeof sMaxWidth !== 'undefined') {
FlexBoxStylingHelper.setStyle(oRm, oLayoutData, "max-width", sMaxWidth);
}
};
/**
* Sets style (including fall-back styles) to the given control, using the provided {@link sap.ui.core.RenderManager}.
*
* @param {sap.ui.core.RenderManager} oRm the RenderManager that can be used for writing to the render output buffer
* @param {sap.m.FlexItemData} oLayoutData an object representation of the layout data
* @param {string} sProperty name of the property
* @param {string} sValue value of the property
*/
FlexBoxStylingHelper.setStyle = function(oRm, oLayoutData, sProperty, sValue) {
if (typeof (sValue) === "string") {
// Convert camel-case to lower-case and dashes
sValue = sValue.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
}
FlexBoxStylingHelper.writeStyle(oRm, oLayoutData, sProperty, sValue);
};
/**
* Writes the style to the given control, using the provided {@link sap.ui.core.RenderManager} or jQuery.
*
* @param {sap.ui.core.RenderManager} oRm the RenderManager that can be used for writing to the render output buffer
* @param {sap.m.FlexItemData} oLayoutData an object representation of the layout data
* @param {string} sProperty name of the property
* @param {string} sValue value of the property
*/
FlexBoxStylingHelper.writeStyle = function(oRm, oLayoutData, sProperty, sValue) {
// IE 10-11 miscalculate the width of the flex items when box-sizing: border-box // TODO remove after 1.62 version
// Instead of using flex-basis, we use an explicit width/height
// @see https://github.com/philipwalton/flexbugs#7-flex-basis-doesnt-account-for-box-sizingborder-box
if (Device.browser.internet_explorer && (sProperty === "flex-basis" || sProperty === "flex-preferred-size")) {
if (oLayoutData.getParent()) {
if (oLayoutData.getParent().getParent().getDirection().indexOf("Row") > -1) {
sProperty = "width";
} else {
sProperty = "height";
}
}
}
// Finally, write property value to control using either the render manager or the element directly
if (oRm) {
if (sValue === "0" || sValue) {
oRm.addStyle(sProperty, sValue);
}
} else {
// Set the property on the wrapper or the control root itself
if (oLayoutData.$().length) { // Does the layout data have a DOM representation?
// jQuery removes 'null' styles
if (sValue !== "0" && !sValue) {
oLayoutData.$().css(sProperty, null);
} else {
oLayoutData.$().css(sProperty, sValue);
}
} else {
// Get control root for bare item
if (oLayoutData.getParent()) {
// jQuery removes 'null' styles
if (sValue !== "0" && !sValue) {
oLayoutData.getParent().$().css(sProperty, null);
} else {
oLayoutData.getParent().$().css(sProperty, sValue);
}
}
}
}
};
return FlexBoxStylingHelper;
}, /* bExport= */ true);