/** * Copyright SocialSite (C) 2009 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.socialsite.image; import java.util.Date; import org.apache.wicket.ResourceReference; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.markup.html.form.upload.FileUpload; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.util.value.ValueMap; import com.socialsite.BasePanel; import com.socialsite.ajax.fileupload.UploadPanel; import com.socialsite.authentication.SocialSiteRoles; /** * @author Ananth */ public class ImagePanel extends BasePanel { /** * */ private static final long serialVersionUID = 1L; final private boolean changeLink; /** * sets the thumnail as false * * @param component * component id * @param id * id used to fetch the image * @param imageType * type of the image (userimage , courseimage etc) * @param lastModified * lastmodified date of the image */ public ImagePanel(final String component, final long id, final ImageType imageType, final Date lastModified) { this(component, id, imageType, lastModified, false, true); } public ImagePanel(final String component, final long id, final ImageType imageType, final Date lastModified, final boolean thumb) { this(component, id, imageType, lastModified, thumb, false); } /** * * @param component * component id * @param id * id used to fetch the image * @param imageType * type of the image (userimage , courseimage etc) * @param thumb * will show thumb image if true * @param lastModified * lastmodified date of the image */ public ImagePanel(final String component, final long id, final ImageType imageType, final Date lastModified, final boolean thumb, final boolean changeLink) { super(component); this.changeLink = changeLink; // allow the modal window to update the panel setOutputMarkupId(true); final ResourceReference imageResource = new ResourceReference(imageType.name()); final Image userImage; final ValueMap valueMap = new ValueMap(); valueMap.add("id", id + ""); // the version is used to change the url dynamically if the image is // changed. This will allow the browser to cache images // reference http://code.google.com/speed/page-speed/docs/caching.html // #Use fingerprinting to dynamically enable caching. valueMap.add("version", lastModified.getTime() + ""); if (thumb) { valueMap.add("thumb", "true"); } add(userImage = new Image("userimage", imageResource, valueMap)); userImage.setOutputMarkupId(true); final ModalWindow modal; add(modal = new ModalWindow("modal")); modal.setContent(new UploadPanel(modal.getContentId()) { /** * */ private static final long serialVersionUID = 1L; @Override public String onFileUploaded(final FileUpload upload) { if (upload == null || upload.getSize() == 0) { // No image was provided error("Please upload an image."); } else if (!checkContentType(upload.getContentType())) { error("Only images of types png, jpg, and gif are allowed."); } else { saveImage(upload.getBytes()); } return null; } @Override public void onUploadFinished(final AjaxRequestTarget target, final String filename, final String newFileUrl) { final ResourceReference imageResource = new ResourceReference(imageType.name()); final ValueMap valueMap = new ValueMap(); valueMap.add("id", id + ""); // change the image lively valueMap.add("version", new Date().getTime() + ""); if (thumb) { valueMap.add("thumb", "true"); } userImage.setImageResourceReference(imageResource, valueMap); // update the image after the user changes it target.addComponent(userImage); } }); modal.setTitle(" Select the image "); modal.setCookieName("modal"); modal.setCloseButtonCallback(new ModalWindow.CloseButtonCallback() { /** * */ private static final long serialVersionUID = 1L; public boolean onCloseButtonClicked(final AjaxRequestTarget target) { return true; } }); modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() { /** * */ private static final long serialVersionUID = 1L; public void onClose(final AjaxRequestTarget target) { } }); add(new AjaxLink<Void>("changeimage") { /** * */ private static final long serialVersionUID = 1L; @Override public boolean isVisible() { if (changeLink) { // TODO allow admins to change the university image and // allow // staffs to change the course image // it. don't show it for thumb images return hasRole(SocialSiteRoles.OWNER) || hasRole(SocialSiteRoles.STAFF); } return false; } @Override public void onClick(final AjaxRequestTarget target) { modal.show(target); } }); } private boolean checkContentType(final String contentType) { if (contentType.equalsIgnoreCase("image/gif") || contentType.equalsIgnoreCase("image/jpeg") || contentType.equalsIgnoreCase("image/png")) { return true; } return false; } /** * override this method to save the file * * @param imageData */ protected void saveImage(final byte[] imageData) { } }