package com.vaadin.tests.components.embedded; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Date; import javax.imageio.ImageIO; import com.vaadin.server.StreamResource; import com.vaadin.tests.components.TestBase; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Embedded; public class EmbeddedImageRefresh extends TestBase { @Override protected String getDescription() { return "Tests if requestRepaint() makes the browser reload a dynamic resource."; } @Override protected Integer getTicketNumber() { return 2470; } @Override protected void setup() { // Create the embedded. final Embedded embedded = new Embedded(); embedded.setDescription("Click on the grid cells to switch them."); addComponent(embedded); // Attach it to a resource. final MyImageSource imageSource = new MyImageSource(); final StreamResource imageResource = new StreamResource(imageSource, "testimage.png"); imageResource.setCacheTime(0); embedded.setSource(imageResource); // The button requests repainting the embedded. Button button = new Button("refr"); button.addClickListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { embedded.markAsDirty(); } }); addComponent(button); button = new Button("refr name"); button.addClickListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { ((StreamResource) embedded.getSource()) .setFilename(new Date().getTime() + ".png"); embedded.markAsDirty(); } }); addComponent(button); button = new Button("200x200"); button.addClickListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { embedded.setWidth("200px"); embedded.setHeight("200px"); } }); addComponent(button); button = new Button("undef"); button.addClickListener(new Button.ClickListener() { @Override public void buttonClick(ClickEvent event) { embedded.setSizeUndefined(); } }); addComponent(button); } public class MyImageSource implements StreamResource.StreamSource { public MyImageSource() { } int intervalPos(int pos, int resolution, int cells) { return (int) Math.round(pos * resolution / (cells * 1.0)); } @Override public InputStream getStream() { // Create an image and draw some background on it. BufferedImage image = new BufferedImage(640, 480, BufferedImage.TYPE_INT_RGB); Graphics drawable = image.getGraphics(); // Background drawable.setColor(Color.white); drawable.fillRect(0, 0, 640, 480); final int rows = 10; final int cols = 10; // Grid for (int row = 0; row < rows; row++) { int gridy = intervalPos(row, 480, rows); int gridynext = intervalPos(row + 1, 480, rows); // Horizontal grid line if (row > 0) { drawable.setColor(Color.lightGray); drawable.drawLine(0, gridy, 640 - 1, gridy); } for (int col = 0; col < cols; col++) { int gridx = intervalPos(col, 640, cols); int gridxnext = intervalPos(col + 1, 640, cols); // Vertical grid line if (row == 0 && col > 0) { drawable.setColor(Color.lightGray); drawable.drawLine(gridx, 0, gridx, 480 - 1); } // Cell if (Math.random() < 0.5f) { drawable.setColor(Color.white); } else { drawable.setColor(Color.black); } drawable.fillRect(gridx + 1, gridy + 1, gridxnext - gridx - 1, gridynext - gridy - 1); } } try { // Write the image to a buffer. ByteArrayOutputStream imagebuffer = new ByteArrayOutputStream(); ImageIO.write(image, "png", imagebuffer); // Return a stream from the buffer. ByteArrayInputStream istream = new ByteArrayInputStream( imagebuffer.toByteArray()); return istream; // new DownloadStream (istream,null,null); } catch (IOException e) { return null; } } } }