/* * Copyright 2014 Max Schuster * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.maxschuster.vaadin.signaturefield.demo; import com.vaadin.annotations.PreserveOnRefresh; import com.vaadin.annotations.Push; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.net.MalformedURLException; import javax.servlet.annotation.WebServlet; import com.vaadin.annotations.Theme; import com.vaadin.annotations.VaadinServletConfiguration; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.data.util.BeanItemContainer; import com.vaadin.data.util.ObjectProperty; import com.vaadin.server.BrowserWindowOpener; import com.vaadin.server.ExternalResource; import com.vaadin.server.StreamResource; import com.vaadin.server.StreamResource.StreamSource; import com.vaadin.server.VaadinRequest; import com.vaadin.server.VaadinServlet; import com.vaadin.shared.communication.PushMode; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Notification; import com.vaadin.ui.UI; import eu.maxschuster.dataurl.DataUrl; import eu.maxschuster.dataurl.DataUrlBuilder; import eu.maxschuster.dataurl.DataUrlEncoding; import eu.maxschuster.dataurl.DataUrlSerializer; import eu.maxschuster.dataurl.IDataUrlSerializer; import eu.maxschuster.vaadin.colorpickerfield.converter.ColorToRgbaConverter; import eu.maxschuster.vaadin.signaturefield.converter.StringToDataUrlConverter; import eu.maxschuster.vaadin.signaturefield.shared.MimeType; import java.io.IOException; import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.IOUtils; @Theme("demo") @PreserveOnRefresh @Push(PushMode.AUTOMATIC) public class DemoUI extends UI { private static final long serialVersionUID = 1L; @WebServlet(value = "/*", asyncSupported = true) @VaadinServletConfiguration( productionMode = true, ui = DemoUI.class, widgetset = "eu.maxschuster.vaadin.signaturefield.demo.DemoWidgetSet" ) public static class Servlet extends VaadinServlet { private static final long serialVersionUID = 1L; } private final ObjectProperty<DataUrl> dataUrlProperty = new ObjectProperty<DataUrl>(null, DataUrl.class); private final BeanItemContainer<MimeType> mimeTypeContainer = new BeanItemContainer<MimeType>(MimeType.class, Arrays.asList(new MimeType[]{ MimeType.PNG, MimeType.JPEG })); private final DemoUILayout l = new DemoUILayout(); private IDataUrlSerializer serializer; @Override protected void init(VaadinRequest request) { setContent(l); // Set href and target manually // ToDo: Move back to declarative layout when vaadin bug is fixed l.signaturePadLink.setResource(new ExternalResource( "https://github.com/szimek/signature_pad")); l.signaturePadLink.setTargetName("_blank"); l.signatureFieldLink.setResource(new ExternalResource( "https://github.com/maxschuster/Vaadin-SignatureField")); l.signatureFieldLink.setTargetName("_blank"); getPage().setTitle(l.pageTitleLabel.getValue()); l.signatureField.setBackgroundColor("rgba(255,255,255, 1)"); l.signatureField.setPenColor("rgba(18, 10, 143, 1)"); l.signatureField.setPropertyDataSource(dataUrlProperty); l.signatureField.setConverter(new StringToDataUrlConverter()); l.clearButton.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { l.signatureField.clear(); } }); final BrowserWindowOpener saveOpener = new BrowserWindowOpener(""); saveOpener.setWindowName("_blank"); saveOpener.extend(l.saveButton); l.mimeTypeComboBox.setContainerDataSource(mimeTypeContainer); //l.mimeTypeComboBox.setItemCaptionPropertyId("mimeType"); //l.mimeTypeComboBox.setNullSelectionAllowed(false); l.mimeTypeComboBox.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { MimeType mimeType = (MimeType) event.getProperty().getValue(); l.signatureField.setMimeType(mimeType); } }); l.mimeTypeComboBox.setValue(l.signatureField.getMimeType()); l.dotSizeTextField.setConverter(Double.class); l.dotSizeTextField.setNullSettingAllowed(true); l.dotSizeTextField.setConvertedValue(l.signatureField.getDotSize()); l.dotSizeTextField.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { l.signatureField.setDotSize((Double) l.dotSizeTextField.getConvertedValue()); } }); l.minWidthTextField.setConverter(Double.class); l.minWidthTextField.setConvertedValue(l.signatureField.getMinWidth()); l.minWidthTextField.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { l.signatureField.setMinWidth((Double) l.minWidthTextField.getConvertedValue()); } }); l.maxWidthTextField.setConverter(Double.class); l.maxWidthTextField.setConvertedValue(l.signatureField.getMaxWidth()); l.maxWidthTextField.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { l.signatureField.setMaxWidth((Double) l.maxWidthTextField.getConvertedValue()); } }); l.velocityFilterWeightTextField.setConverter(Double.class); l.velocityFilterWeightTextField.setConvertedValue(l.signatureField.getVelocityFilterWeight()); l.velocityFilterWeightTextField.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { l.signatureField.setVelocityFilterWeight((Double) l.velocityFilterWeightTextField.getConvertedValue()); } }); l.backgroundColorColorPicker.setConverter(new ColorToRgbaConverter()); l.backgroundColorColorPicker.setConvertedValue(l.signatureField.getBackgroundColor()); l.backgroundColorColorPicker.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { l.signatureField.setBackgroundColor((String)l.backgroundColorColorPicker.getConvertedValue()); Notification.show( "The background color will change after\n" + "you have cleared the signature field!", Notification.Type.WARNING_MESSAGE ); } }); l.penColorColorPicker.setConverter(new ColorToRgbaConverter()); l.penColorColorPicker.setConvertedValue(l.signatureField.getPenColor()); l.penColorColorPicker.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { l.signatureField.setPenColor((String)l.penColorColorPicker.getConvertedValue()); } }); l.immediateCheckBox.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { boolean immediate = (Boolean) event.getProperty().getValue(); l.signatureField.setImmediate(immediate); } }); l.readOnlyCheckBox.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { boolean readOnly = (Boolean) event.getProperty().getValue(); l.signatureField.setReadOnly(readOnly); l.mimeTypeComboBox.setReadOnly(readOnly); l.clearButton.setEnabled(!readOnly); } }); l.requiredCheckBox.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { boolean required = (Boolean) event.getProperty().getValue(); l.signatureField.setRequired(required); } }); l.clearButtonEnabledCheckBox.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { boolean clearButtonEnabled = (Boolean) event.getProperty().getValue(); l.signatureField.setClearButtonEnabled(clearButtonEnabled); } }); l.dataUrlAsText.setPropertyDataSource(l.signatureField); l.emptyLabel.setValue(String.valueOf(l.signatureField.isEmpty())); l.signatureField.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; @Override public void valueChange(ValueChangeEvent event) { String signature = (String) event.getProperty().getValue(); l.stringPreviewImage.setSource(signature != null ? new ExternalResource(signature) : null); l.emptyLabel.setValue(String.valueOf(l.signatureField.isEmpty())); } }); dataUrlProperty.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; private int counter = 0; @Override public void valueChange(ValueChangeEvent event) { try { final DataUrl signature = (DataUrl) event.getProperty().getValue(); l.dataUrlPreviewImage.setSource(signature != null ? new ExternalResource(getSerializer().serialize(signature)) : null); StreamResource streamResource = null; if (signature != null) { StreamSource streamSource = new StreamSource() { private static final long serialVersionUID = 1L; @Override public InputStream getStream() { return new ByteArrayInputStream(signature.getData()); } }; MimeType mimeType = MimeType.valueOfMimeType(signature.getMimeType()); String extension = null; switch (mimeType) { case JPEG: extension = "jpg"; break; case PNG: extension = "png"; break; } streamResource = new StreamResource(streamSource, "signature." + counter + "." + extension); streamResource.setMIMEType(signature.getMimeType()); streamResource.setCacheTime(0); } saveOpener.setResource(streamResource); l.binaryPreviewImage.setSource(streamResource); } catch (MalformedURLException e) { Logger.getLogger(DemoUI.class.getName()).log( Level.SEVERE, e.getLocalizedMessage(), e); } finally { counter++; } } }); l.testFromDataUrlButton.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { l.testFromDataUrlButton.setEnabled(true); try { byte[] data = IOUtils.toByteArray(DemoUI.class.getResourceAsStream("hello-dataurl.png")); DataUrl value = (new DataUrlBuilder()) .setData(data) .setMimeType("image/png") .setEncoding(DataUrlEncoding.BASE64) .build(); dataUrlProperty.setValue(value); } catch (IOException ex) { Notification.show("Error reading test value!", Notification.Type.ERROR_MESSAGE); Logger.getLogger(DemoUI.class.getName()).log(Level.SEVERE, null, ex); } } }); l.testFromStringButton.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { l.testFromStringButton.setEnabled(true); try { String value = IOUtils.toString( DemoUI.class.getResourceAsStream("hello-string.txt")); l.signatureField.setValue(value); } catch (IOException ex) { Notification.show("Error reading test value!", Notification.Type.ERROR_MESSAGE); Logger.getLogger(DemoUI.class.getName()).log(Level.SEVERE, null, ex); } } }); l.testTransparentButton.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; @Override public void buttonClick(ClickEvent event) { l.testTransparentButton.setEnabled(true); try { byte[] data = IOUtils.toByteArray(DemoUI.class.getResourceAsStream("transparent.png")); DataUrl value = (new DataUrlBuilder()) .setData(data) .setMimeType("image/png") .setEncoding(DataUrlEncoding.BASE64) .build(); l.signatureField.setConvertedValue(value); } catch (IOException ex) { Notification.show("Error reading test value!", Notification.Type.ERROR_MESSAGE); Logger.getLogger(DemoUI.class.getName()).log(Level.SEVERE, null, ex); } } }); l.resultsAccordion.setSelectedTab(0); } public IDataUrlSerializer getSerializer() { if (serializer == null) { serializer = new DataUrlSerializer(); } return serializer; } }