org.opencms.ade.galleries.client.preview.CmsCroppingParamBean Maven / Gradle / Ivy
Show all versions of opencms-gwt Show documentation
/*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.ade.galleries.client.preview;
import org.opencms.util.CmsStringUtil;
/**
* Scale parameter data bean.
*
* @since 8.0.0
*/
public class CmsCroppingParamBean {
/** The scale parameter colon. */
private static final String SCALE_PARAM_COLON = ":";
/** Scale parameter name. */
private static final String SCALE_PARAM_CROP_HEIGHT = "ch";
/** Scale parameter name. */
private static final String SCALE_PARAM_CROP_WIDTH = "cw";
/** Scale parameter name. */
private static final String SCALE_PARAM_CROP_X = "cx";
/** Scale parameter name. */
private static final String SCALE_PARAM_CROP_Y = "cy";
/** The scale parameter delimiter. */
private static final String SCALE_PARAM_DELIMITER = ",";
/** The scale parameter equal. */
private static final String SCALE_PARAM_EQ = "=";
/** Scale parameter name. */
private static final String SCALE_PARAM_NAME = "__scale";
/** Scale parameter name. */
private static final String SCALE_PARAM_TARGETHEIGHT = "h";
/** Scale parameter name. */
private static final String SCALE_PARAM_TARGETWIDTH = "w";
/** Format parameter name. */
private static final String SCALE_FORMAT_NAME_PARAM = "format";
/** The cropping height parameter. */
private int m_cropHeight = I_CmsFormatRestriction.DIMENSION_NOT_SET;
/** The cropping width parameter. */
private int m_cropWidth = I_CmsFormatRestriction.DIMENSION_NOT_SET;
/** The cropping X parameter. */
private int m_cropX = I_CmsFormatRestriction.DIMENSION_NOT_SET;
/** The cropping Y parameter. */
private int m_cropY = I_CmsFormatRestriction.DIMENSION_NOT_SET;
/** The used format name. */
private String m_formatName;
/** The original image height. */
private int m_orgHeight = I_CmsFormatRestriction.DIMENSION_NOT_SET;
/** The original image width. */
private int m_orgWidth = I_CmsFormatRestriction.DIMENSION_NOT_SET;
/** The target height. */
private int m_targetHeight = I_CmsFormatRestriction.DIMENSION_NOT_SET;
/** The target width. */
private int m_targetWidth = I_CmsFormatRestriction.DIMENSION_NOT_SET;
/**
* Constructor.
*/
public CmsCroppingParamBean() {
// nothing to do here
}
/**
* Copy constructor.
*
* @param copy the copy values to use
*/
public CmsCroppingParamBean(CmsCroppingParamBean copy) {
this(copy.getOrgHeight(), copy.getOrgWidth());
m_cropHeight = copy.getCropHeight();
m_cropWidth = copy.getCropWidth();
m_cropX = copy.getCropX();
m_cropY = copy.getCropY();
m_targetHeight = copy.getTargetHeight();
m_targetWidth = copy.getTargetWidth();
}
/**
* Constructor.
*
* @param orgHeight the original image height
* @param orgWidth the original image width
*/
public CmsCroppingParamBean(int orgHeight, int orgWidth) {
m_orgHeight = orgHeight;
m_orgWidth = orgWidth;
}
/**
* Parses an image scale parameter and returns the parsed data.
*
* @param selectedPath the image path including the scale parameter
*
* @return the cropping data
*/
public static CmsCroppingParamBean parseImagePath(String selectedPath) {
CmsCroppingParamBean result = null;
int pos = selectedPath.indexOf(SCALE_PARAM_NAME + SCALE_PARAM_EQ);
if (pos > -1) {
// removing string part before the scaling parameter
String param = selectedPath.substring(pos + SCALE_PARAM_NAME.length() + SCALE_PARAM_EQ.length());
// removing string part after the scaling parameter
pos = param.indexOf("&");
if (pos > -1) {
param = param.substring(0, pos);
}
result = parseScaleParam(param);
} else {
result = new CmsCroppingParamBean();
}
// look up format name if available
pos = selectedPath.indexOf(SCALE_FORMAT_NAME_PARAM + SCALE_PARAM_EQ);
if (pos > -1) {
String param = selectedPath.substring(pos + SCALE_FORMAT_NAME_PARAM.length() + SCALE_PARAM_EQ.length());
// removing string part after the scaling parameter
pos = param.indexOf("&");
if (pos > -1) {
param = param.substring(0, pos);
}
result.setFormatName(param);
}
return result;
}
/**
* Parses an image scale parameter and returns the parsed data.
*
* @param param the image path including the scale parameter
*
* @return the cropping data
*/
public static CmsCroppingParamBean parseScaleParam(String param) {
CmsCroppingParamBean result = new CmsCroppingParamBean();
if (CmsStringUtil.isEmptyOrWhitespaceOnly(param)) {
return result;
}
String[] parameters = param.split(SCALE_PARAM_DELIMITER);
for (int i = 0; i < parameters.length; i++) {
String scaleParam = parameters[i].trim();
if (scaleParam.startsWith(SCALE_PARAM_TARGETHEIGHT + SCALE_PARAM_COLON)) {
result.setTargetHeight(parseValue(SCALE_PARAM_TARGETHEIGHT, scaleParam));
continue;
}
if (scaleParam.startsWith(SCALE_PARAM_TARGETWIDTH + SCALE_PARAM_COLON)) {
result.setTargetWidth(parseValue(SCALE_PARAM_TARGETWIDTH, scaleParam));
continue;
}
if (scaleParam.startsWith(SCALE_PARAM_CROP_X + SCALE_PARAM_COLON)) {
result.setCropX(parseValue(SCALE_PARAM_CROP_X, scaleParam));
continue;
}
if (scaleParam.startsWith(SCALE_PARAM_CROP_Y + SCALE_PARAM_COLON)) {
result.setCropY(parseValue(SCALE_PARAM_CROP_Y, scaleParam));
continue;
}
if (scaleParam.startsWith(SCALE_PARAM_CROP_HEIGHT + SCALE_PARAM_COLON)) {
result.setCropHeight(parseValue(SCALE_PARAM_CROP_HEIGHT, scaleParam));
continue;
}
if (scaleParam.startsWith(SCALE_PARAM_CROP_WIDTH + SCALE_PARAM_COLON)) {
result.setCropWidth(parseValue(SCALE_PARAM_CROP_WIDTH, scaleParam));
continue;
}
}
return result;
}
/**
* Parses a single scale value. Returning -1
-->
* {@link I_CmsFormatRestriction#DIMENSION_NOT_SET} invalid parameters.
*
* @param paramName the parameter name
* @param param the parameter
*
* @return the value
*/
private static native int parseValue(String paramName, String param)/*-{
param = param.substr(paramName.length + 1);
var result = parseInt(param);
if (isNaN(result)) {
return I_CmsFormatRestriction.DIMENSION_NOT_SET;
}
return result;
}-*/;
/**
* Returns the cropping height parameter.
*
* @return the cropping height parameter
*/
public int getCropHeight() {
return m_cropHeight;
}
/**
* Returns the cropping width parameter.
*
* @return the cropping width parameter
*/
public int getCropWidth() {
return m_cropWidth;
}
/**
* Returns the cropping X parameter.
*
* @return the cropping X parameter
*/
public int getCropX() {
return m_cropX;
}
/**
* Returns the cropping Y parameter.
*
* @return the cropping Y parameter
*/
public int getCropY() {
return m_cropY;
}
/**
* Returns the used format name.
*
* @return the used format name
*/
public String getFormatName() {
return m_formatName;
}
/**
* Returns the original image height.
*
* @return the original image height
*/
public int getOrgHeight() {
return m_orgHeight;
}
/**
* Returns the original image width.
*
* @return the original image width
*/
public int getOrgWidth() {
return m_orgWidth;
}
/**
* Returns the resulting image ratio.
*
* @return the image ratio
*/
public double getRatio() {
double ratio = 1;
if ((getTargetWidth() == -1) || (getTargetHeight() == -1)) {
ratio = (double)getOrgWidth() / getOrgHeight();
} else {
ratio = (double)getTargetWidth() / getTargetHeight();
}
return ratio;
}
/**
* Returns a cropping bean with a restricted maximum target size.
*
* @param maxHeight the max height
* @param maxWidth the max width
*
* @return the cropping bean
*/
public CmsCroppingParamBean getRestrictedSizeParam(int maxHeight, int maxWidth) {
CmsCroppingParamBean result = new CmsCroppingParamBean(this);
if ((getTargetHeight() <= maxHeight) && (getTargetWidth() <= maxWidth)) {
if ((getTargetHeight() == I_CmsFormatRestriction.DIMENSION_NOT_SET) && (getOrgHeight() > maxHeight)) {
result.setTargetHeight(maxHeight);
}
if ((getTargetWidth() == I_CmsFormatRestriction.DIMENSION_NOT_SET) && (getOrgWidth() > maxWidth)) {
result.setTargetWidth(maxWidth);
}
return result;
}
if (((1.00 * getTargetHeight()) / getTargetWidth()) > ((1.00 * maxHeight) / maxWidth)) {
result.setTargetHeight(maxHeight);
double width = (1.00 * getTargetWidth() * maxHeight) / getTargetHeight();
result.setTargetWidth((int)Math.floor(width));
return result;
}
double height = (1.00 * getTargetHeight() * maxWidth) / getTargetWidth();
result.setTargetHeight((int)Math.floor(height));
result.setTargetWidth(maxWidth);
return result;
}
/**
* Returns the scale parameter to this bean for a restricted maximum target size.
*
* @param maxHeight the max height
* @param maxWidth the max width
*
* @return the scale parameter
*/
public String getRestrictedSizeScaleParam(int maxHeight, int maxWidth) {
String result = toString();
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(result)) {
return getRestrictedSizeParam(maxHeight, maxWidth).toString();
}
CmsCroppingParamBean restricted = new CmsCroppingParamBean();
restricted.setTargetHeight(maxHeight);
restricted.setTargetWidth(maxWidth);
return restricted.toString();
}
/**
* Returns the resulting height of the cropped image.
*
* @return the height
*/
public int getResultingHeight() {
int height = getResultingTargetHeight();
if (height == -1) {
if (isCropped()) {
height = m_cropHeight;
} else {
height = m_orgHeight;
}
}
return height;
}
/**
* Returns the resulting width of the cropped image.
*
* @return the width
*/
public int getResultingWidth() {
int width = getResultingTargetWidth();
if (width == -1) {
if (isCropped()) {
width = m_cropWidth;
} else {
width = m_orgWidth;
}
}
return width;
}
/**
* Returns the scale parameter.
*
* @return the scale parameter
*/
public String getScaleParam() {
if (!isScaled() && !isCropped()) {
// the image is not cropped nor scaled, return an empty parameter
return "";
}
StringBuffer result = new StringBuffer();
if ((m_targetHeight > -1) || (m_targetWidth > -1)) {
result.append(SCALE_PARAM_TARGETHEIGHT).append(SCALE_PARAM_COLON).append(getResultingTargetHeight()).append(
SCALE_PARAM_DELIMITER);
result.append(SCALE_PARAM_TARGETWIDTH).append(SCALE_PARAM_COLON).append(getResultingTargetWidth()).append(
SCALE_PARAM_DELIMITER);
}
if (m_cropX > -1) {
result.append(SCALE_PARAM_CROP_X).append(SCALE_PARAM_COLON).append(m_cropX).append(SCALE_PARAM_DELIMITER);
}
if (m_cropY > -1) {
result.append(SCALE_PARAM_CROP_Y).append(SCALE_PARAM_COLON).append(m_cropY).append(SCALE_PARAM_DELIMITER);
}
if (m_cropHeight > -1) {
result.append(SCALE_PARAM_CROP_HEIGHT).append(SCALE_PARAM_COLON).append(m_cropHeight).append(
SCALE_PARAM_DELIMITER);
}
if (m_cropWidth > -1) {
result.append(SCALE_PARAM_CROP_WIDTH).append(SCALE_PARAM_COLON).append(m_cropWidth).append(
SCALE_PARAM_DELIMITER);
}
if (result.length() > 0) {
result.deleteCharAt(result.length() - 1);
}
return result.toString();
}
/**
* Returns the target height.
*
* @return the target height
*/
public int getTargetHeight() {
return m_targetHeight;
}
/**
* Returns the target width.
*
* @return the target width
*/
public int getTargetWidth() {
return m_targetWidth;
}
/**
* Returns if contained parameters indicate a cropped image.
*
* @return true
if contained parameters indicate a cropped image
*/
public boolean isCropped() {
return m_cropX > I_CmsFormatRestriction.DIMENSION_NOT_SET;
}
/**
* Returns if the given cropping parameters would scale the image.
*
* @return true
if the image is scaled
*/
public boolean isScaled() {
return !(((m_targetHeight == m_orgHeight) || (m_targetHeight == -1))
&& ((m_targetWidth == m_orgWidth) || (m_targetWidth == -1)));
}
/**
* Resets the cropping parameters to no cropping.
*/
public void reset() {
m_cropHeight = I_CmsFormatRestriction.DIMENSION_NOT_SET;
m_cropWidth = I_CmsFormatRestriction.DIMENSION_NOT_SET;
m_cropX = I_CmsFormatRestriction.DIMENSION_NOT_SET;
m_cropY = I_CmsFormatRestriction.DIMENSION_NOT_SET;
m_targetHeight = I_CmsFormatRestriction.DIMENSION_NOT_SET;
m_targetWidth = I_CmsFormatRestriction.DIMENSION_NOT_SET;
}
/**
* Sets the cropping height parameter.
*
* @param cropHeight the cropping height parameter to set
*/
public void setCropHeight(int cropHeight) {
m_cropHeight = cropHeight;
}
/**
* Sets the cropping width parameter.
*
* @param cropWidth the cropping width parameter to set
*/
public void setCropWidth(int cropWidth) {
m_cropWidth = cropWidth;
}
/**
* Sets the cropping X parameter.
*
* @param cropX the cropping X parameter to set
*/
public void setCropX(int cropX) {
m_cropX = cropX;
}
/**
* Sets the cropping Y parameter.
*
* @param cropY the cropping Y parameter to set
*/
public void setCropY(int cropY) {
m_cropY = cropY;
}
/**
* Sets the used format name.
*
* @param formatName the used format name to set
*/
public void setFormatName(String formatName) {
m_formatName = formatName;
}
/**
* Sets the original image height.
*
* @param orgHeight the original image height to set
*/
public void setOrgHeight(int orgHeight) {
m_orgHeight = orgHeight;
}
/**
* Sets the original image width.
*
* @param orgWidth the original image width to set
*/
public void setOrgWidth(int orgWidth) {
m_orgWidth = orgWidth;
}
/**
* Sets the target height.
*
* @param targetHeight the target height to set
*/
public void setTargetHeight(int targetHeight) {
m_targetHeight = targetHeight;
}
/**
* Sets the target width.
*
* @param targetWidth the target width to set
*/
public void setTargetWidth(int targetWidth) {
m_targetWidth = targetWidth;
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
String result = getScaleParam();
if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(result)) {
result = SCALE_PARAM_NAME + SCALE_PARAM_EQ + result;
}
return result;
}
/**
* Returns the resulting target height if set, otherwise '-1'.
*
* @return the height
*/
private int getResultingTargetHeight() {
int height = -1;
if ((m_targetHeight > -1) || (m_targetWidth > -1)) {
if (m_targetHeight > -1) {
height = m_targetHeight;
} else {
height = (int)Math.floor(((1.00 * m_orgHeight) / m_orgWidth) * m_targetWidth);
}
}
return height;
}
/**
* Returns the resulting target width if set, otherwise '-1'.
*
* @return the width
*/
private int getResultingTargetWidth() {
int width = -1;
if ((m_targetHeight > -1) || (m_targetWidth > -1)) {
if (m_targetWidth > -1) {
width = m_targetWidth;
} else {
width = (int)Math.floor(((1.00 * m_orgWidth) / m_orgHeight) * m_targetHeight);
}
}
return width;
}
}