org.opencms.ade.galleries.client.preview.ui.CmsCroppingDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.opencms.ade.galleries.client.preview.ui.CmsCroppingDialog.java

Source

/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (c) Alkacon Software GmbH (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.ui;

import org.opencms.ade.galleries.client.Messages;
import org.opencms.ade.galleries.client.preview.CmsCroppingParamBean;
import org.opencms.gwt.client.ui.CmsAreaSelectPanel;
import org.opencms.gwt.client.ui.CmsPushButton;
import org.opencms.gwt.client.util.CmsPositionBean;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;

/**
 * Image cropping dialog.<p>
 * 
 * @since 8.0.0
 */
public class CmsCroppingDialog extends Composite
        implements ValueChangeHandler<CmsPositionBean>, HasValueChangeHandlers<CmsCroppingParamBean> {

    /** The ui-binder for this widget. */
    interface I_CmsCroppingDialogUiBinder extends UiBinder<Widget, CmsCroppingDialog> {
        // GWT interface, nothing to do
    }

    /** The empty field string. */
    private static final String EMPTY_FIELD = "---";

    /** The ui-binder interface. */
    private static I_CmsCroppingDialogUiBinder m_uiBinder = GWT.create(I_CmsCroppingDialogUiBinder.class);

    /** The cancel button. */
    @UiField
    protected CmsPushButton m_cancelButton;

    /** The cropping panel. */
    @UiField
    protected CmsAreaSelectPanel m_croppingPanel;

    /** The height label. */
    @UiField
    protected Label m_heightDisplay;

    /** The height label. */
    @UiField
    protected Label m_heightLabel;

    /** The image. */
    @UiField
    protected Image m_image;

    /** The OK button. */
    @UiField
    protected CmsPushButton m_okButton;

    /** The height label. */
    @UiField
    protected Label m_scaleDisplay;

    /** The height label. */
    @UiField
    protected Label m_scaleLabel;

    /** The height label. */
    @UiField
    protected Label m_widthDisplay;
    /** The height label. */
    @UiField
    protected Label m_widthLabel;

    /** The cropping parameters. */
    private CmsCroppingParamBean m_croppingParam;

    /** The cropping parameters of the displayed image. */
    private CmsCroppingParamBean m_displayCropping;

    /** The ratio from original image height to display height. */
    private double m_heightRatio;

    /** The image path. */
    private String m_imagePath;

    /** The ratio from original image width to display width. */
    private double m_widthRatio;

    /**
     * Constructor.<p>
     * 
     * @param imagePath the image path
     */
    public CmsCroppingDialog(String imagePath) {

        initWidget(m_uiBinder.createAndBindUi(this));

        m_imagePath = imagePath;

        m_croppingPanel.addValueChangeHandler(this);
        m_croppingPanel.setFireAll(true);

        m_widthLabel.setText(Messages.get().key(Messages.GUI_PREVIEW_LABEL_WIDTH_0));
        m_widthDisplay.setText(EMPTY_FIELD);
        m_heightLabel.setText(Messages.get().key(Messages.GUI_PREVIEW_LABEL_HEIGHT_0));
        m_heightDisplay.setText(EMPTY_FIELD);
        m_scaleLabel.setText(Messages.get().key(Messages.GUI_IMAGE_SCALE_0));
        m_scaleDisplay.setText(EMPTY_FIELD);
        m_okButton.setText(org.opencms.gwt.client.Messages.get().key(org.opencms.gwt.client.Messages.GUI_OK_0));
        m_okButton.setUseMinWidth(true);
        m_cancelButton
                .setText(org.opencms.gwt.client.Messages.get().key(org.opencms.gwt.client.Messages.GUI_CANCEL_0));
        m_cancelButton.setUseMinWidth(true);
    }

    /**
     * @see com.google.gwt.event.logical.shared.HasValueChangeHandlers#addValueChangeHandler(com.google.gwt.event.logical.shared.ValueChangeHandler)
     */
    public HandlerRegistration addValueChangeHandler(ValueChangeHandler<CmsCroppingParamBean> handler) {

        return addHandler(handler, ValueChangeEvent.getType());
    }

    /**
     * @see com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)
     */
    public void onValueChange(ValueChangeEvent<CmsPositionBean> event) {

        CmsPositionBean pos = event.getValue();
        if (pos != null) {
            calculateCropping(pos);
            if (m_croppingParam.getTargetWidth() > 0) {
                if (m_croppingParam.getTargetHeight() > 0) {
                    m_heightDisplay.setText(String.valueOf(m_croppingParam.getTargetHeight()));
                    m_widthDisplay.setText(String.valueOf(m_croppingParam.getTargetWidth()));
                } else {
                    m_widthDisplay.setText(String.valueOf(m_croppingParam.getTargetWidth()));
                    m_heightDisplay.setText(String.valueOf((int) Math
                            .floor((1.00 * m_croppingParam.getTargetWidth() * m_croppingParam.getCropHeight())
                                    / m_croppingParam.getCropWidth())));
                }
            } else if (m_croppingParam.getTargetHeight() > 0) {
                m_heightDisplay.setText(String.valueOf(m_croppingParam.getTargetHeight()));
                m_widthDisplay.setText(String.valueOf(
                        (int) Math.floor((1.00 * m_croppingParam.getTargetHeight() * m_croppingParam.getCropWidth())
                                / m_croppingParam.getCropHeight())));
            } else {
                m_heightDisplay.setText(String.valueOf(m_croppingParam.getCropHeight()));
                m_widthDisplay.setText(String.valueOf(m_croppingParam.getCropWidth()));
            }

            String scale = "100%";
            if (m_croppingParam.getTargetHeight() > 0) {
                scale = String
                        .valueOf((int) Math.floor(
                                (100.00 * m_croppingParam.getCropHeight()) / m_croppingParam.getTargetHeight()))
                        + "%";
            } else if (m_croppingParam.getTargetWidth() > 0) {
                scale = String
                        .valueOf((int) Math.floor(
                                (100.00 * m_croppingParam.getCropWidth()) / m_croppingParam.getTargetWidth()))
                        + "%";
            }
            m_scaleDisplay.setText(scale);
            m_okButton.enable();
        } else {
            m_okButton.disable(Messages.get().key(Messages.GUI_IMAGE_NO_AREA_SELECTED_0));
            m_heightDisplay.setText(EMPTY_FIELD);
            m_widthDisplay.setText(EMPTY_FIELD);
            m_scaleDisplay.setText(EMPTY_FIELD);
        }

    }

    /**
     * Shows the dialog.<p>
     * 
     * @param targetParam the target cropping parameter, containing the target size restriction
     */
    public void show(CmsCroppingParamBean targetParam) {

        getElement().getStyle().setDisplay(Display.BLOCK);
        m_croppingParam = targetParam;
        m_displayCropping = new CmsCroppingParamBean();
        m_displayCropping.setTargetHeight(m_croppingParam.getOrgHeight());
        m_displayCropping.setTargetWidth(m_croppingParam.getOrgWidth());
        m_displayCropping = m_displayCropping.getRestrictedSizeParam(getElement().getOffsetHeight() - 29,
                getElement().getOffsetWidth() - 4);
        m_image.setUrl(m_imagePath + "?" + m_displayCropping.toString());
        m_croppingPanel.getElement().getStyle().setWidth(m_displayCropping.getTargetWidth(), Unit.PX);
        if ((targetParam.getTargetHeight() > 0) && (targetParam.getTargetWidth() > 0)) {
            m_croppingPanel.setRatio((1.00 * targetParam.getTargetHeight()) / targetParam.getTargetWidth());
        }

        m_heightRatio = (1.00 * m_croppingParam.getOrgHeight()) / m_displayCropping.getTargetHeight();
        m_widthRatio = (1.00 * m_croppingParam.getOrgWidth()) / m_displayCropping.getTargetWidth();
        if (m_croppingParam.isCropped()) {
            m_croppingPanel.setAreaPosition(true, calculateSelectPosition());
        } else {
            m_croppingPanel.clearSelection();
        }
    }

    /**
     * Handles the click event for cancel button. Hides the cropping dialog.<p>
     * 
     * @param event the click event
     */
    @UiHandler("m_cancelButton")
    protected void onCancel(ClickEvent event) {

        hide();
    }

    /**
     * Handles the click event for ok button. Sets the selected cropping parameters.<p>
     * 
     * @param event the click event
     */
    @UiHandler("m_okButton")
    protected void onOk(ClickEvent event) {

        if (!((m_croppingParam.getTargetWidth() > 0) && (m_croppingParam.getTargetHeight() > 0))) {
            if (m_croppingParam.getTargetWidth() > 0) {
                m_croppingParam.setTargetHeight(
                        (int) Math.floor((1.00 * m_croppingParam.getTargetWidth() * m_croppingParam.getCropHeight())
                                / m_croppingParam.getCropWidth()));
            } else if (m_croppingParam.getTargetHeight() > 0) {
                m_croppingParam.setTargetWidth(
                        (int) Math.floor((1.00 * m_croppingParam.getTargetHeight() * m_croppingParam.getCropWidth())
                                / m_croppingParam.getCropHeight()));
            } else {
                m_croppingParam.setTargetHeight(m_croppingParam.getCropHeight());
                m_croppingParam.setTargetWidth(m_croppingParam.getCropWidth());
            }
        }
        ValueChangeEvent.fire(this, m_croppingParam);
        hide();
    }

    /**
     * Calculates the resulting cropping parameter from the supplied selection position.<p>
     * 
     * @param position the selection position
     */
    private void calculateCropping(CmsPositionBean position) {

        m_croppingParam.setCropHeight((int) Math.round(m_heightRatio * position.getHeight()));
        m_croppingParam.setCropWidth((int) Math.round(m_widthRatio * position.getWidth()));
        m_croppingParam.setCropY((int) Math.round(m_heightRatio * position.getTop()));
        m_croppingParam.setCropX((int) Math.round(m_widthRatio * position.getLeft()));
    }

    /**
     * Calculates the select area position for the current cropping parameter.<p>
     * 
     * @return the select area position
     */
    private CmsPositionBean calculateSelectPosition() {

        CmsPositionBean result = new CmsPositionBean();
        result.setHeight((int) Math.round(m_croppingParam.getCropHeight() / m_heightRatio));
        result.setWidth((int) Math.round(m_croppingParam.getCropWidth() / m_widthRatio));
        result.setTop((int) Math.round(m_croppingParam.getCropY() / m_heightRatio));
        result.setLeft((int) Math.round(m_croppingParam.getCropX() / m_widthRatio));
        return result;
    }

    /**
     * Hides the cropping dialog.<p>
     */
    private void hide() {

        getElement().getStyle().setDisplay(Display.NONE);
    }

}