/*
* 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.CmsImageFormatHandler;
import org.opencms.gwt.client.ui.CmsPushButton;
import org.opencms.gwt.client.ui.CmsToggleButton;
import org.opencms.gwt.client.ui.css.I_CmsImageBundle;
import org.opencms.gwt.client.ui.input.CmsLabel;
import org.opencms.gwt.client.ui.input.CmsSelectBox;
import org.opencms.gwt.client.ui.input.CmsTextBox;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
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.HTMLPanel;
import com.google.gwt.user.client.ui.Widget;
/**
* Image format form.<p>
*
* @since 8.0.0
*/
public class CmsImageFormatsForm extends Composite implements ValueChangeHandler<String>, KeyPressHandler {
/** GWT ui-binder. */
protected interface I_CmsImageFormatsFormUiBinder extends UiBinder<Widget, CmsImageFormatsForm> {
// nothing to do
}
/** The label width. */
private static final int LABEL_WIDTH = 80;
/** Text metrics key. */
private static final String TM_PREVIEW_TAB_IMAGEFORMATS = "ImageFormatsTab";
/** The ui-binder instance for this class. */
private static I_CmsImageFormatsFormUiBinder uiBinder = GWT.create(I_CmsImageFormatsFormUiBinder.class);
/** The cropping button. */
@UiField
protected CmsPushButton m_cropButton;
/** The height text box. */
@UiField
protected CmsTextBox m_heightBox;
/** The height label. */
@UiField
protected CmsLabel m_heightLabel;
/** The panel holding the content. */
@UiField
protected HTMLPanel m_panel;
/** The ratio lock button. */
@UiField
protected CmsToggleButton m_ratioLock;
/** The remove cropping button. */
@UiField
protected CmsPushButton m_removeCropButton;
/** The reset size button. */
@UiField
protected CmsPushButton m_resetSize;
/** The select box. */
@UiField
protected CmsSelectBox m_selectBox;
/** The select box label. */
@UiField
protected CmsLabel m_selectBoxLabel;
/** The width text box. */
@UiField
protected CmsTextBox m_widthBox;
/** The width label. */
@UiField
protected CmsLabel m_widthLabel;
/** The image format handler. */
private CmsImageFormatHandler m_formatHandler;
/** Flag to indicate if the formats form is enabled. */
private boolean m_formEnabled;
/**
* Constructor.<p>
*
* @param formatHandler the image format handler
*/
public CmsImageFormatsForm(CmsImageFormatHandler formatHandler) {
initWidget(uiBinder.createAndBindUi(this));
// form is enabled by default
m_formEnabled = true;
m_formatHandler = formatHandler;
m_selectBoxLabel.setText(Messages.get().key(Messages.GUI_PREVIEW_LABEL_FORMAT_0));
m_selectBoxLabel.truncate(TM_PREVIEW_TAB_IMAGEFORMATS, LABEL_WIDTH);
// set localized values of the labels
m_cropButton.setText(Messages.get().key(Messages.GUI_PREVIEW_BUTTON_CROP_0));
m_cropButton.setImageClass(I_CmsImageBundle.INSTANCE.style().croppingIcon());
m_removeCropButton.setText(Messages.get().key(Messages.GUI_PREVIEW_BUTTON_REMOVECROP_0));
m_removeCropButton.setImageClass(I_CmsImageBundle.INSTANCE.style().removeCroppingIcon());
m_widthLabel.setText(Messages.get().key(Messages.GUI_PREVIEW_LABEL_WIDTH_0));
m_widthLabel.truncate(TM_PREVIEW_TAB_IMAGEFORMATS, LABEL_WIDTH);
m_heightLabel.setText(Messages.get().key(Messages.GUI_PREVIEW_LABEL_HEIGHT_0));
m_heightLabel.truncate(TM_PREVIEW_TAB_IMAGEFORMATS, LABEL_WIDTH);
m_ratioLock.setImageClass(I_CmsImageBundle.INSTANCE.style().lockedIcon());
m_ratioLock.setDownImageClass(I_CmsImageBundle.INSTANCE.style().unlockedIcon());
m_resetSize.setImageClass(I_CmsImageBundle.INSTANCE.style().resetIcon());
m_selectBox.addValueChangeHandler(this);
m_heightBox.addValueChangeHandler(this);
m_heightBox.addKeyPressHandler(this);
m_widthBox.addValueChangeHandler(this);
m_widthBox.addKeyPressHandler(this);
m_removeCropButton.setVisible(false);
}
/**
* Parses <code>String</code> to <code>int</code>. Return -1 for invalid input.<p>
*
* @param value the value to parse
*
* @return the int-value
*/
private static native int parseInt(String value) /*-{
var ret = parseInt(value);
if (isNaN(ret)) {
return -1;
}
return ret;
}-*/;
/**
* Adds a format select option.<p>
*
* @param value the option value
* @param label the option label
*/
public void addFormatSelectOption(String value, String label) {
m_selectBox.addOption(value, label);
}
/**
* Returns the selected format value.<p>
*
* @return the selected format value
*/
public String getFormatSelectValue() {
return m_selectBox.getFormValueAsString();
}
/**
* Returns the height input or -1 if input is empty or not valid.<p>
*
* @return the height input
*/
public int getHeightInput() {
return parseInt(m_heightBox.getFormValueAsString());
}
/**
* Returns the width input or -1 if input is empty or not valid.<p>
*
* @return the width input
*/
public int getWidthInput() {
return parseInt(m_widthBox.getFormValueAsString());
}
/**
* Opens the cropping dialog on crop button click.<p>
*
* @param event the click event
*/
@UiHandler("m_cropButton")
protected void openCropping(ClickEvent event) {
m_formatHandler.openCropping();
}
/**
* Removes the cropping on button click.<p>
*
* @param event the click event
*/
@UiHandler("m_removeCropButton")
protected void removeCropping(ClickEvent event) {
m_formatHandler.onRemoveCropping();
}
/**
* Toggle the ratio lock on button click.<p>
*
* @param event the click event
*/
@UiHandler("m_ratioLock")
protected void toggleRatioLock(ClickEvent event) {
m_formatHandler.onLockRatio(!m_ratioLock.isDown());
}
/**
* Resets the size on button click.<p>
*
* @param event the click event
*/
@UiHandler("m_resetSize")
protected void resetSize(ClickEvent event) {
m_formatHandler.onResetSize();
}
/**
* @see com.google.gwt.event.dom.client.KeyPressHandler#onKeyPress(com.google.gwt.event.dom.client.KeyPressEvent)
*/
public void onKeyPress(KeyPressEvent event) {
//preventing any input but numbers
char key = event.getCharCode();
int code = event.getNativeEvent().getKeyCode();
if (((key >= '0') && (key <= '9')) || (code == KeyCodes.KEY_BACKSPACE) || (code == KeyCodes.KEY_DELETE)) {
// the value of the input box will probably have changed, so fire an event after the input has been processed
final CmsTextBox source = (CmsTextBox)event.getSource();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
public void execute() {
ValueChangeEvent.fire(source, source.getText());
}
});
return;
}
if ((code == KeyCodes.KEY_TAB)
|| (code == KeyCodes.KEY_LEFT)
|| (code == KeyCodes.KEY_RIGHT)
|| (code == KeyCodes.KEY_ENTER)) {
return;
}
// prevent all others
event.stopPropagation();
event.preventDefault();
}
/**
* @see com.google.gwt.event.logical.shared.ValueChangeHandler#onValueChange(com.google.gwt.event.logical.shared.ValueChangeEvent)
*/
public void onValueChange(ValueChangeEvent<String> event) {
Object source = event.getSource();
if (source == m_selectBox) {
m_formatHandler.onFormatChange(event.getValue());
return;
}
if (source == m_heightBox) {
m_formatHandler.onHeightChange(event.getValue());
return;
}
if (source == m_widthBox) {
m_formatHandler.onWidthChange(event.getValue());
}
}
/**
* Enables/disables buttons and input fields necessary if the image if cropped.<p>
*
* @param cropped <code>true</code> if the image is cropped
*/
public void setCropped(boolean cropped) {
if (cropped) {
m_heightBox.setEnabled(false);
m_widthBox.setEnabled(false);
m_selectBox.setEnabled(false);
m_resetSize.disable(Messages.get().key(Messages.GUI_PREVIEW_BUTTON_DIS_CROPPED_0));
m_ratioLock.disable(Messages.get().key(Messages.GUI_PREVIEW_BUTTON_DIS_CROPPED_0));
m_cropButton.disable(Messages.get().key(Messages.GUI_PREVIEW_BUTTON_DIS_CROPPED_0));
if (m_formEnabled) {
m_removeCropButton.enable();
}
m_removeCropButton.setVisible(true);
return;
}
if (m_formEnabled) {
m_cropButton.enable();
m_heightBox.setEnabled(true);
m_widthBox.setEnabled(true);
m_selectBox.setEnabled(true);
m_resetSize.enable();
m_ratioLock.enable();
}
m_removeCropButton.setVisible(false);
}
/**
* Sets the format select value.<p>
*
* @param value the value
*/
public void setFormatSelectValue(String value) {
m_selectBox.setFormValueAsString(value);
}
/**
* Sets the format form enabled.<p>
*
* @param enabled if <code>true</code> the form will be enabled
*/
public void setFormEnabled(boolean enabled) {
m_formEnabled = enabled;
m_selectBox.setEnabled(enabled);
m_heightBox.setEnabled(enabled);
m_widthBox.setEnabled(enabled);
if (enabled) {
m_cropButton.enable();
m_removeCropButton.enable();
} else {
m_cropButton.disable(Messages.get().key(Messages.GUI_IMAGE_NO_FORMATS_AVAILABLE_0));
m_removeCropButton.disable(Messages.get().key(Messages.GUI_IMAGE_NO_FORMATS_AVAILABLE_0));
}
}
/**
* Sets the height input field.<p>
*
* @param height the value
*/
public void setHeightInput(int height) {
m_heightBox.setFormValueAsString(String.valueOf(height));
}
/**
* Enables the height input field.<p>
*
* @param enabled <code>true</code> to enable the input field
*/
public void setHeightInputEnabled(boolean enabled) {
m_heightBox.setEnabled(enabled);
}
/**
* Sets the state of the ratio lock button.<p>
*
* @param down if <code>true</code> button will be set down / lock open
* @param enabled if <code>true</code> button will be enabled
* @param disableMessage message to show for disabled button
*/
public void setRatioButton(boolean down, boolean enabled, String disableMessage) {
m_ratioLock.setDown(down);
if (enabled) {
m_ratioLock.enable();
} else {
m_ratioLock.disable(disableMessage);
}
}
/**
* Sets the width input field.<p>
*
* @param width the value
*/
public void setWidthInput(int width) {
m_widthBox.setFormValueAsString(String.valueOf(width));
}
/**
* Enables the width input field.<p>
*
* @param enabled <code>true</code> to enable the input field
*/
public void setWidthInputEnabled(boolean enabled) {
m_widthBox.setEnabled(enabled);
}
}