All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.xaloon.wicket.plugin.image.panel.ImagePanel Maven / Gradle / Ivy

There is a newer version: 1.6.1
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.xaloon.wicket.plugin.image.panel;

import javax.inject.Inject;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.IAjaxCallDecorator;
import org.apache.wicket.ajax.calldecorator.AjaxCallDecorator;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.image.NonCachingImage;
import org.apache.wicket.markup.html.panel.GenericPanel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.xaloon.core.api.image.AlbumFacade;
import org.xaloon.core.api.image.model.ImageComposition;
import org.xaloon.core.api.security.SecurityFacade;
import org.xaloon.core.api.storage.ByteArrayAsInputStreamContainer;
import org.xaloon.core.api.storage.FileDescriptor;
import org.xaloon.core.api.storage.FileRepositoryFacade;
import org.xaloon.core.api.storage.UrlInputStreamContainer;
import org.xaloon.core.api.util.HtmlElementEnum;
import org.xaloon.wicket.component.classifier.panel.CustomModalWindow;
import org.xaloon.wicket.plugin.image.plugin.GallerySecurityAuthorities;

/**
 * @author vytautas r.
 */
public class ImagePanel extends GenericPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private int imageWidth = 200;

	private int imageHeight = 100;

	@Inject
	private FileRepositoryFacade fileRepositoryFacade;

	@Inject
	private AlbumFacade albumFacade;
	
	@Inject
	private SecurityFacade securityFacade;
	
	/**
	 * Construct.
	 * 
	 * @param id
	 * @param model
	 */
	public ImagePanel(String id, IModel model) {
		super(id, model);
		setOutputMarkupId(true);
	}

	@Override
	protected void onBeforeRender() {
		super.onBeforeRender();
		removeAll();
		final ImageComposition image = getModelObject();

		// Add show temporary image
		FileDescriptor temporaryFiledeDescriptor = image.getImage().getThumbnail();
		if (temporaryFiledeDescriptor == null) {
			temporaryFiledeDescriptor = image.getImage();
		}
		if (temporaryFiledeDescriptor != null && temporaryFiledeDescriptor.getImageInputStreamContainer() == null) {
			if (temporaryFiledeDescriptor.isExternal()) {
				temporaryFiledeDescriptor.setImageInputStreamContainer(new UrlInputStreamContainer(temporaryFiledeDescriptor.getPath()));
			} else {
				temporaryFiledeDescriptor.setImageInputStreamContainer(new ByteArrayAsInputStreamContainer(fileRepositoryFacade
						.getFileByPath(temporaryFiledeDescriptor.getPath())));
			}
		}
		TemporaryResource temporaryResource = new TemporaryResource(temporaryFiledeDescriptor);
		Image temporaryImage = new NonCachingImage("temporary-image", temporaryResource);
		temporaryImage.add(AttributeModifier.replace(HtmlElementEnum.WIDTH.value(), String.valueOf(imageWidth)));
		temporaryImage.add(AttributeModifier.replace(HtmlElementEnum.HEIGHT.value(), String.valueOf(imageHeight)));
		temporaryImage.setVisible(!temporaryResource.isEmpty());
		add(temporaryImage);

		// Add delete image link
		add(new AjaxLink("delete-image-link") {
			private static final long serialVersionUID = 1L;

			@Override
			protected IAjaxCallDecorator getAjaxCallDecorator() {
				return new AjaxCallDecorator() {
					private static final long serialVersionUID = 1L;

					@Override
					public CharSequence decorateScript(Component c, CharSequence script) {
						return "if(!confirm('Are you sure you want to delete this item?')) return false;" + script;
					}
				};
			}

			@Override
			public void onClick(AjaxRequestTarget target) {
				deleteFileDescriptor(image);
				Component componentToRefresh = getOnCloseRefreshComponent();
				if (componentToRefresh != null) {
					target.add(componentToRefresh);
				}
			}
		}.setVisible(securityFacade.hasAny(GallerySecurityAuthorities.IMAGE_DELETE)));

		// Add the modal window to edit image information
		final ModalWindow imageInformationModalWindow = new CustomModalWindow("modal-image-information", "Image information") {
			private static final long serialVersionUID = 1L;
			@Override
			protected void addComponentsToRefresh(java.util.List components) {
				components.add(ImagePanel.this);
			};
		};
		imageInformationModalWindow.setContent(new ImageDescriptionPanel(imageInformationModalWindow.getContentId(), new Model(image.getImage())) {
			private static final long serialVersionUID = 1L;

			@Override
			protected void onImageUpdate(AjaxRequestTarget target, org.xaloon.core.api.image.model.Image entity) {
				//Usually parent of this panel should be responsible to save new entity, so we just update existing one here
				if (entity.getId() != null) {
					albumFacade.save(entity);				
				}
				imageInformationModalWindow.close(target);
			}
			
		});
		add(imageInformationModalWindow);

		// Add edit image metadata modal window
		add(new AjaxLink("edit-information") {
			private static final long serialVersionUID = 1L;

			@Override
			public void onClick(AjaxRequestTarget target) {
				imageInformationModalWindow.show(target);
			}
		}.setVisible(securityFacade.hasAny(GallerySecurityAuthorities.IMAGE_EDIT)));
	}

	protected Component getOnCloseRefreshComponent() {
		return ImagePanel.this;
	}

	/**
	 * Delete file descriptor and file
	 * 
	 * @param imageToDelete
	 */
	protected void deleteFileDescriptor(ImageComposition imageToDelete) {

	}

	/**
	 * @param imageWidth
	 */
	public void setImageWidth(int imageWidth) {
		this.imageWidth = imageWidth;
	}

	/**
	 * @param imageHeight
	 */
	public void setImageHeight(int imageHeight) {
		this.imageHeight = imageHeight;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy