X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fwamblee%2Fphotos%2Fwicket%2FHomePage.java;h=289f783e35340e3358eb48ecb0e5669475007446;hb=c64efa2d2002d15b22f458391cd44dfca44f8c96;hp=26331e6fec69d83494ca993d8b1aafd61a8c3ba5;hpb=0edd451bb32da41f5c54ec2acfb11a693f567ec9;p=photos diff --git a/src/main/java/org/wamblee/photos/wicket/HomePage.java b/src/main/java/org/wamblee/photos/wicket/HomePage.java index 26331e6..289f783 100644 --- a/src/main/java/org/wamblee/photos/wicket/HomePage.java +++ b/src/main/java/org/wamblee/photos/wicket/HomePage.java @@ -15,13 +15,21 @@ */ package org.wamblee.photos.wicket; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.List; - import javax.inject.Inject; import org.apache.wicket.PageParameters; +import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.image.Image; +import org.apache.wicket.markup.html.link.Link; +import org.apache.wicket.markup.repeater.RepeatingView; +import org.apache.wicket.resource.ByteArrayResource; import org.wamblee.photos.model.Album; +import org.wamblee.photos.model.Photo; import org.wamblee.photos.model.PhotoEntry; import org.wamblee.photos.model.plumbing.AllPhotos; import org.wamblee.photos.model.plumbing.AuthorizedPhotos; @@ -36,18 +44,35 @@ public class HomePage extends BasePage { private static final long serialVersionUID = 1L; @Inject - private User user; + private transient User user; @Inject - private UserAdministration userAdmin; + private transient UserAdministration userAdmin; + + // TODO the state should be stored as a path. @Inject @AllPhotos - private Album album; + private transient Album album; @Inject @AuthorizedPhotos - private Album authorized; + private transient Album authorized; + + private class SerializableEntryLink extends Link { + + private String path; + + public SerializableEntryLink(String aId, String aPath) { + super(aId); + path = aPath; + } + + @Override + public void onClick() { + System.out.println("Entry " + path + " was clicked"); + } + } /** * Constructor that is invoked when page is invoked without a session. @@ -77,5 +102,92 @@ public class HomePage extends BasePage { PhotoEntry entry = authorized.getEntry(i); System.out.println("Entry " + i + " " + entry.getId() + " " + entry.getPath()); } + + int ientry = 0; + int irow = 0; + RepeatingView row = new RepeatingView("row"); + add(row); + while (irow < 5 && ientry < authorized.size()) { + int icolumn = 0; + WebMarkupContainer columns = new WebMarkupContainer(row.newChildId()); + row.add(columns); + RepeatingView column = new RepeatingView("column"); + columns.add(column); + while (icolumn < 5 && ientry < authorized.size()) { + WebMarkupContainer thumbnail = new WebMarkupContainer(column.newChildId()); + column.add(thumbnail); + + final PhotoEntry entry = authorized.getEntry(ientry); + Link link = new SerializableEntryLink("thumbnail", entry.getPath()); + thumbnail.add(link); + ImageData data = getData(entry); + + // TODO very inefficient. all data is loaded when generating the page. + link.add(new Image("image", new ByteArrayResource(data.getContentType(), data.getData()))); + + link.add(new Label("name", authorized.getEntry(ientry).getId())); + icolumn++; + ientry++; + } + irow++; + } + } + + public static final class ImageData { + private String contentType; + private byte[] data; + + public ImageData(String aContentType, byte[] aData) { + contentType = aContentType; + data = aData; + } + + public String getContentType() { + return contentType; + } + + public byte[] getData() { + return data; + } + } + + private ImageData getData(PhotoEntry aEntry) { + if (aEntry instanceof Photo) { + return getData((Photo) aEntry); + } else if (aEntry instanceof Album) { + return getData((Album) aEntry); + } else { + throw new RuntimeException("Unsupported type " + aEntry.getClass().getName()); + } + } + + private ImageData getData(Photo aPhoto) { + try (InputStream is = aPhoto.getThumbNail()) { + return new ImageData("image/jpeg", getBytes(is)); + } + catch (IOException e) { + // to improve. + throw new RuntimeException("Cannot read photo", e); + } + } + + private byte[] getBytes(InputStream is) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + byte[] block = new byte[1024]; + int n = is.read(block); + while (n > 0) { + bos.write(block, 0, n); + n = is.read(block); + } + return bos.toByteArray(); + } + + private ImageData getData(Album aAlbum) { + try (InputStream is = getClass().getResourceAsStream("folder.png")) { + return new ImageData("image/png", getBytes(is)); + } + catch (IOException e) { + throw new RuntimeException("Cannot read album jpg", e); + } } -} +} \ No newline at end of file