kz.supershiny.web.wicket.panels.admin.ImageUploadPanel.java Source code

Java tutorial

Introduction

Here is the source code for kz.supershiny.web.wicket.panels.admin.ImageUploadPanel.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package kz.supershiny.web.wicket.panels.admin;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import kz.supershiny.core.model.TireImage;
import kz.supershiny.core.services.ImageService;
import kz.supershiny.core.services.ImageService.ImageSize;
import kz.supershiny.web.wicket.components.ConfirmationLink;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.markup.html.form.upload.FileUploadField;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.resource.DynamicImageResource;
import org.apache.wicket.request.resource.IResource;
import org.apache.wicket.util.lang.Bytes;

/**
 * Panel for uploading images for tires (admin part).
 *
 * @author aishmanov
 */
public class ImageUploadPanel extends Panel {

    private UploadForm uploadForm;
    private List<TireImage> currentImages = new ArrayList<TireImage>();
    private Set<String> deletedImages = new HashSet<String>();
    private ListView imagesView;
    private WebMarkupContainer viewContainer;

    public ImageUploadPanel(String id, List<TireImage> images) {
        super(id);

        initData(images);

        uploadForm = new UploadForm("uploadForm");
        add(uploadForm.setOutputMarkupId(true));

        //Display/edit images
        viewContainer = new WebMarkupContainer("viewContainer");
        //images doesn't exist, wicket uses getter getImages() of ImageUploadPanel
        imagesView = new ListView("imagesView", new PropertyModel(ImageUploadPanel.this, "images")) {
            @Override
            protected void populateItem(ListItem li) {
                final TireImage ti = (TireImage) li.getModelObject();
                final AjaxLink defaultLink;
                final AjaxLink removeLink;
                Image image = new Image("image", new DynamicImageResource() {
                    @Override
                    protected byte[] getImageData(IResource.Attributes atrbts) {
                        return ti.getImageBody();
                    }
                });
                defaultLink = new AjaxLink("defaultLink") {
                    @Override
                    public void onClick(AjaxRequestTarget target) {
                        setPreviewImage(ti.getFileName());
                        target.add(viewContainer);
                    }
                };
                if (ti.getIsPreview()) {
                    defaultLink.setEnabled(false);
                    defaultLink.add(new AttributeAppender("class", Model.of("btn btn-primary")));
                } else {
                    defaultLink.setEnabled(true);
                    defaultLink.add(new AttributeAppender("class", Model.of("btn btn-default")));
                }
                removeLink = new ConfirmationLink("removeLink",
                        new StringResourceModel("ask.deletionPhoto", ImageUploadPanel.this, null).getString()) {
                    @Override
                    public void onClick(AjaxRequestTarget target) {
                        deletedImages.add(ti.getFileName());
                        target.add(viewContainer);
                    }
                };
                li.add(image);
                li.add(defaultLink);
                li.add(removeLink);
            }
        };
        viewContainer.add(imagesView.setOutputMarkupId(true));
        add(viewContainer.setOutputMarkupId(true));
    }

    private void initData(List<TireImage> images) {
        currentImages = images;
        deletedImages = new HashSet<String>();
        if (currentImages == null) {
            currentImages = new ArrayList<TireImage>();
        }
    }

    //sets the image with this filename as default for all sizes
    public void setPreviewImage(String imgName) {
        for (TireImage item : currentImages) {
            if (item.getFileName().equals(imgName)) {
                item.setIsPreview(Boolean.TRUE);
            } else {
                item.setIsPreview(Boolean.FALSE);
            }
        }
    }

    //gets only LARGE images
    public List<TireImage> getImages() {
        List<TireImage> larges = new ArrayList<TireImage>();
        for (TireImage img : currentImages) {
            if (img.getImageSize().equals(ImageService.ImageSize.LARGE)
                    && !deletedImages.contains(img.getFileName())) {
                larges.add(img);
            }
        }
        return larges;
    }

    //returns the whole list of images of all sizes for persistence
    public List<TireImage> getAllImages() {
        List<TireImage> result = new ArrayList<TireImage>();
        for (TireImage img : currentImages) {
            if (!deletedImages.contains(img.getFileName())) {
                result.add(img);
            }
        }
        return result;
    }

    //Upload images
    private class UploadForm extends Form {

        private FileUploadField fileUpload;
        private List<FileUpload> uploads = new ArrayList<FileUpload>();

        public UploadForm(String id) {
            super(id);

            setMultiPart(true);
            setMaxSize(Bytes.kilobytes(8172));

            fileUpload = new FileUploadField("fileUpload", new PropertyModel<List<FileUpload>>(this, "uploads"));
            add(fileUpload.setOutputMarkupId(true));

            add(new AjaxSubmitLink("uploadButton") {

                @Override
                protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                    if (uploads != null) {
                        processUploads();
                    }
                    target.add(fileUpload);
                    target.add(uploadForm);
                    target.add(viewContainer);
                }

            });
        }

        @Override
        protected void onSubmit() {

        }

        public List<FileUpload> getUploads() {
            return uploads;
        }

        //all magic is done here
        private void processUploads() {
            for (FileUpload item : uploads) {
                //add original
                currentImages.add(new TireImage(null, item.getClientFileName(), ImageService.ImageSize.ORIGINAL,
                        item.getBytes()));
                //create and add large sized image
                byte[] imgBytes;
                imgBytes = ImageService.resizeImage(item.getBytes(), ImageSize.LARGE);
                currentImages
                        .add(new TireImage(null, item.getClientFileName(), ImageService.ImageSize.LARGE, imgBytes));
                //create and add small sized image
                imgBytes = ImageService.resizeImage(item.getBytes(), ImageSize.SMALL);
                currentImages
                        .add(new TireImage(null, item.getClientFileName(), ImageService.ImageSize.SMALL, imgBytes));
            }
            if (uploads != null) {
                uploads.clear();
            } else {
                uploads = new ArrayList<FileUpload>();
            }
        }
    }
}