kz.supershiny.web.wicket.panels.catalogue.ImageViewerPanel.java Source code

Java tutorial

Introduction

Here is the source code for kz.supershiny.web.wicket.panels.catalogue.ImageViewerPanel.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.catalogue;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import kz.supershiny.core.model.Tire;
import kz.supershiny.core.model.TireImage;
import kz.supershiny.core.services.ImageService;
import kz.supershiny.core.services.TireService;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.ContextImage;
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.StringResourceModel;
import org.apache.wicket.request.resource.DynamicImageResource;
import org.apache.wicket.request.resource.IResource;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author kilrwhle
 */
public class ImageViewerPanel extends Panel {

    private static final Logger LOG = LoggerFactory.getLogger(ImageViewerPanel.class);

    @SpringBean
    private TireService tireService;

    private Map<Integer, TireImage> images;
    private WebMarkupContainer numbersContainer;
    private ListView numbers;
    private Image image;
    private AjaxLink prev, next;
    private int selected = 0;
    private int total = 0;

    public ImageViewerPanel(String id, Tire tire) {
        super(id);

        add(new Label("modal.title",
                new StringResourceModel("modal.photos", ImageViewerPanel.this, null).getString() + " "
                        + tire.getManufacturer().getCompanyName() + " " + tire.getModelName()));

        images = new HashMap<Integer, TireImage>();
        int counter = 0;
        try {
            for (TireImage ti : tireService.getImagesForTire(tire, ImageService.ImageSize.LARGE)) {
                images.put(counter, ti);
                counter++;
            }
        } catch (NullPointerException ex) {
            LOG.error("Empty images list!");
        }

        total = images.size();

        if (!images.isEmpty()) {
            image = new Image("image", new DynamicImageResource() {
                @Override
                protected byte[] getImageData(IResource.Attributes atrbts) {
                    return images.get(selected).getImageBody();
                }
            });
            add(image.setOutputMarkupId(true));
        } else {
            add(new ContextImage("image", "images/default-preview.png"));
        }

        prev = new AjaxLink("prev") {
            @Override
            public void onClick(AjaxRequestTarget art) {
                if (selected > 0) {
                    switchImage(--selected, art);
                }
                art.add(prev);
                art.add(next);
            }

            @Override
            public boolean isEnabled() {
                return selected > 0;
            }
        };
        add(prev.setMarkupId("prev").setOutputMarkupPlaceholderTag(true));
        next = new AjaxLink("next") {
            @Override
            public void onClick(AjaxRequestTarget art) {
                if (selected < total - 1) {
                    switchImage(++selected, art);
                }
                art.add(prev);
                art.add(next);
            }

            @Override
            public boolean isEnabled() {
                return selected < total - 1;
            }
        };
        add(next.setMarkupId("next").setOutputMarkupPlaceholderTag(true));

        numbersContainer = new WebMarkupContainer("numbersContainer");
        add(numbersContainer.setOutputMarkupId(true));
        numbers = new ListView("numbers", new ArrayList(images.keySet())) {

            @Override
            protected void populateItem(final ListItem li) {
                final int index = (Integer) li.getModelObject();
                AjaxLink link = new AjaxLink("numberLink") {
                    @Override
                    public void onClick(AjaxRequestTarget art) {
                        selected = index;
                        switchImage(index, art);
                    }
                };
                link.add(new Label("number", index + 1));
                if (index == selected) {
                    link.add(AttributeModifier.replace("class", "btn btn-primary"));
                } else {
                    link.add(AttributeModifier.replace("class", "btn btn-default"));
                }
                li.add(link);
            }
        };
        numbersContainer.add(numbers.setOutputMarkupId(true));
    }

    private void switchImage(final int index, AjaxRequestTarget art) {
        image.setImageResource(new DynamicImageResource() {
            @Override
            protected byte[] getImageData(IResource.Attributes atrbts) {
                return images.get(index).getImageBody();
            }
        });
        art.add(image);
        art.add(prev);
        art.add(next);
        art.add(numbersContainer);
    }

}