com.hybridbpm.ui.component.DocumentField.java Source code

Java tutorial

Introduction

Here is the source code for com.hybridbpm.ui.component.DocumentField.java

Source

/*
 * Copyright (c) 2011-2015 Marat Gubaidullin. 
 *
 * This file is part of HYBRIDBPM.
 *
 * 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 com.hybridbpm.ui.component;

import com.hybridbpm.core.data.document.Document;
import com.vaadin.server.FontAwesome;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomField;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Upload;
import com.vaadin.ui.themes.ValoTheme;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.Date;

/**
 *
 * @author Marat Gubaidullin
 */
public class DocumentField extends CustomField<Document> implements Button.ClickListener {

    private final Button btnDownload = new Button(null, this);
    private final ImageUploader imageUploader = new ImageUploader();
    private final Upload fileUpload = new Upload(null, imageUploader);
    private final Button btnRemove = new Button(null, this);
    private final HorizontalLayout form = new HorizontalLayout(btnDownload, fileUpload, btnRemove);
    private Document document;
    public ByteArrayOutputStream baos = new ByteArrayOutputStream();
    private byte[] image = null;

    public DocumentField() {
        form.setSpacing(true);
        form.addStyleName("file-field");
        btnDownload.addStyleName(ValoTheme.BUTTON_LINK);
        btnRemove.addStyleName(ValoTheme.BUTTON_LINK);
        btnRemove.setIcon(FontAwesome.TIMES_CIRCLE);
        fileUpload.setImmediate(true);
        fileUpload.addSucceededListener(imageUploader);
        checkVisibility();
    }

    private void checkVisibility() {
        if (document.getBody() == null) {
            btnDownload.setVisible(false);
            btnRemove.setVisible(false);
            fileUpload.setVisible(true);
        } else {
            fileUpload.setVisible(false);
            btnDownload.setVisible(true);
            btnRemove.setVisible(true);
        }
    }

    @Override
    protected Component initContent() {
        return form;
    }

    @Override
    public Class<? extends Document> getType() {
        return Document.class;
    }

    @Override
    protected Document getInternalValue() {
        return document;
    }

    @Override
    protected void setInternalValue(Document document) {
        this.document = document;
        checkVisibility();
    }

    @Override
    public void buttonClick(Button.ClickEvent event) {
        if (event.getButton().equals(btnDownload)) {

        } else if (event.getButton().equals(btnRemove)) {
            document.setBody(null);
            document.setSize(0);
            document.setMime(null);
            checkVisibility();
        }
    }

    class ImageUploader implements Upload.Receiver, Upload.SucceededListener {

        private String filename;

        @Override
        public OutputStream receiveUpload(String filename, String mimeType) {
            this.filename = filename;
            btnDownload.setCaption(filename);
            document.setMime(mimeType);
            baos.reset();
            return baos;
        }

        @Override
        public void uploadSucceeded(Upload.SucceededEvent event) {
            image = baos.toByteArray();
            document.setCreateDate(new Date());
            document.setBody(image);
            document.setSize(image.length);
            checkVisibility();
        }
    };

}