From: Erik Brakkee Date: Sun, 22 Sep 2013 16:31:45 +0000 (+0200) Subject: Putting the album content in its own panel. X-Git-Url: http://wamblee.org/gitweb/?a=commitdiff_plain;h=8b1bc175311d80b5ca67d8f6ee8a266428cb5fa3;p=photos Putting the album content in its own panel. --- diff --git a/src/main/java/org/wamblee/photos/wicket/AlbumPanel.html b/src/main/java/org/wamblee/photos/wicket/AlbumPanel.html new file mode 100644 index 0000000..345b619 --- /dev/null +++ b/src/main/java/org/wamblee/photos/wicket/AlbumPanel.html @@ -0,0 +1,38 @@ + + + Wicket Quickstart Archetype Homepage + + +Wicket Quickstart Archetype Homepage +
+
+ + +Message here. + + +
+ + + + + +
+ + + + + + + + + +
photo name
+
+
+
+
+ + + diff --git a/src/main/java/org/wamblee/photos/wicket/AlbumPanel.java b/src/main/java/org/wamblee/photos/wicket/AlbumPanel.java new file mode 100644 index 0000000..093ed15 --- /dev/null +++ b/src/main/java/org/wamblee/photos/wicket/AlbumPanel.java @@ -0,0 +1,180 @@ +/* + * Copyright 2005-2010 the original author or authors. + * + * Licensed 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.wamblee.photos.wicket; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.logging.Logger; +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.html.panel.Panel; +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.AuthorizedPhotos; + +/** + * Homepage + */ +public class AlbumPanel extends Panel { + + private static final Logger LOGGER = Logger.getLogger(AlbumPanel.class.getName()); + + private static final long serialVersionUID = 1L; + + @Inject + @AuthorizedPhotos + 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"); + PageParameters pars = new PageParameters(); + pars.put("path", path); + + setResponsePage(HomePage.class, pars); + } + } + + private String path; + + /** + * Constructor that is invoked when page is invoked without a session. + * + * @param parameters Page parameters + */ + public AlbumPanel(String aId, final PageParameters parameters) throws Exception { + super(aId); + + path = parameters.getString("path", "/"); + if (!path.startsWith("/")) { + info("Invalid album '" + path + "', showing root album instead"); + path = "/"; + } + + PhotoEntry current = authorized.getEntry(path); + + if (current instanceof Photo) { + throw new RuntimeException("AlbumPanel can only show album: " + current.getClass().getName()); + } + + Album album = (Album) current; + + int ientry = 0; + int irow = 0; + RepeatingView row = new RepeatingView("row"); + add(row); + while (irow < 5 && ientry < album.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 < album.size()) { + WebMarkupContainer thumbnail = new WebMarkupContainer(column.newChildId()); + column.add(thumbnail); + + final PhotoEntry entry = album.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", album.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 diff --git a/src/main/java/org/wamblee/photos/wicket/HomePage.html b/src/main/java/org/wamblee/photos/wicket/HomePage.html index 26ac07e..e110290 100644 --- a/src/main/java/org/wamblee/photos/wicket/HomePage.html +++ b/src/main/java/org/wamblee/photos/wicket/HomePage.html @@ -12,26 +12,7 @@ Message here. -
- - - - - -
- - - - - - - - - -
photo name
-
-
-
+ Content diff --git a/src/main/java/org/wamblee/photos/wicket/HomePage.java b/src/main/java/org/wamblee/photos/wicket/HomePage.java index a7aa1a3..0a55e86 100644 --- a/src/main/java/org/wamblee/photos/wicket/HomePage.java +++ b/src/main/java/org/wamblee/photos/wicket/HomePage.java @@ -15,20 +15,13 @@ */ package org.wamblee.photos.wicket; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; import java.util.List; import java.util.logging.Logger; 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; @@ -126,91 +119,6 @@ public class HomePage extends BasePage { Album album = (Album) current; - int ientry = 0; - int irow = 0; - RepeatingView row = new RepeatingView("row"); - add(row); - while (irow < 5 && ientry < album.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 < album.size()) { - WebMarkupContainer thumbnail = new WebMarkupContainer(column.newChildId()); - column.add(thumbnail); - - final PhotoEntry entry = album.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", album.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); - } + add(new AlbumPanel("content", parameters)); } } \ No newline at end of file