/**
*
*/
package org.squidy.nodes.powerpointer;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.Window;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.event.EventListenerList;
import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.squidy.designer.util.FontUtils;
import org.squidy.designer.util.ImageUtils;
import org.squidy.designer.util.StrokeUtils;
/**
* <code>DisplayDomainProvider</code>.
*
* <pre>
* Date: May 07, 2010
* Time: 3:42:50 PM
* </pre>
*
* @author Roman Rädle, <a
* href="mailto:Roman.Raedle@uni-konstanz.de">Roman.Raedle@uni-konstanz.de</a>,
* University of Konstanz
* @version $Id: SlideOverview.java 772 2011-09-16 15:39:44Z raedle $
* @since 1.5.0
*/
public class SlideOverview extends Window {
public static void main(String[] args) {
SlideOverview slideOverview = new SlideOverview();
slideOverview.setVisible(true);
slideOverview.setSize(new Dimension(800, 600));
slideOverview.setMaximumSize(new Dimension(800, 600));
slideOverview.setPreferredSize(new Dimension(800, 600));
// slideOverview.pack();
}
/**
* Default generated serial version UID.
*/
private static final long serialVersionUID = -965450405880371747L;
private final EventListenerList listeners = new EventListenerList();
private File ppt;
public SlideOverview() {
this(new File("/Users/raedle/Desktop/Test3/SquidyWorkshop.ppt"));
}
public SlideOverview(final File ppt) {
super(null);
// super(800, 400);
this.ppt = ppt;
setSize(new Dimension(1000, 600));
setPreferredSize(new Dimension(1000, 600));
setMaximumSize(new Dimension(1000, 600));
setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));
setAlwaysOnTop(true);
augmentWindowWithComponents();
setLocation(50, 50);
}
/* (non-Javadoc)
* @see org.squidy.designer.component.TransparentWindow#augmentWindowWithComponents()
*/
protected void augmentWindowWithComponents() {
SwingUtilities.invokeLater(new Runnable() {
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
try {
FileInputStream inputStream = new FileInputStream(ppt);
SlideShow ppt = new SlideShow(inputStream);
inputStream.close();
Dimension pageSize = ppt.getPageSize();
for (Slide slide : ppt.getSlides()) {
System.out.println("process slide");
SlideComponent slideComponent = new SlideComponent(slide, pageSize.width, pageSize.height);
add(slideComponent);
System.out.println("slide processed");
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
pack();
}
});
}
public void addSlideSelectionListener(SlideSelectionListener listener) {
listeners.add(SlideSelectionListener.class, listener);
}
protected class SlideComponent extends JComponent {
/**
* Default generated serial version UID.
*/
private static final long serialVersionUID = 1175616566716704778L;
private Slide slide;
private BufferedImage slideImage;
private boolean slideDrawn = false;
private static final float SCALE_FACTOR = 0.2f;
private JLabel loadingLabel;
private String slideLabel;
private boolean hovered = false;
public SlideComponent(final Slide slide, final int width, final int height) {
this.slide = slide;
slideLabel = "Slide " + slide.getSlideNumber();
setLayout(new BorderLayout());
setSize(new Dimension((int) (width * SCALE_FACTOR), (int) (height * SCALE_FACTOR)));
setPreferredSize(new Dimension((int) (width * SCALE_FACTOR), (int) (height * SCALE_FACTOR)));
// setBounds(0, 0, (int) (width * SCALE_FACTOR), (int) (height * SCALE_FACTOR));
try {
loadingLabel = new JLabel(new ImageIcon(ImageUtils.loadImageFromClasspath("/org/squidy/nodes/image/loader.gif")));
add(loadingLabel, BorderLayout.CENTER);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// Thread createImage = new Thread() {
//
// /* (non-Javadoc)
// * @see java.lang.Runnable#run()
// */
// public void run() {
slideImage = new BufferedImage((int) (width * SCALE_FACTOR), (int) (height * SCALE_FACTOR), BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = slideImage.createGraphics();
AffineTransform transform = AffineTransform.getScaleInstance(SCALE_FACTOR, SCALE_FACTOR);
graphics.setTransform(transform);
//clear the drawing area
graphics.setPaint(Color.WHITE);
graphics.fill(new Rectangle2D.Float(0, 0, (int) (width * SCALE_FACTOR), (int) (height * SCALE_FACTOR)));
//render
try {
slide.draw(graphics);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println( Runtime.getRuntime().freeMemory() + " free out of " + Runtime.getRuntime().totalMemory() );
}
graphics.dispose();
slideDrawn = true;
remove(loadingLabel);
repaint();
// }
// };
// createImage.setPriority(Thread.MIN_PRIORITY);
// createImage.start();
addMouseListener(new MouseAdapter() {
/* (non-Javadoc)
* @see java.awt.event.MouseAdapter#mouseEntered(java.awt.event.MouseEvent)
*/
@Override
public void mouseEntered(MouseEvent e) {
super.mouseEntered(e);
hovered = true;
repaint();
}
/* (non-Javadoc)
* @see java.awt.event.MouseAdapter#mouseExited(java.awt.event.MouseEvent)
*/
@Override
public void mouseExited(MouseEvent e) {
super.mouseExited(e);
hovered = false;
repaint();
}
/* (non-Javadoc)
* @see java.awt.event.MouseAdapter#mouseClicked(java.awt.event.MouseEvent)
*/
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
// for (SlideSelectionListener listener : listeners.getListeners(SlideSelectionListener.class)) {
// listener.slideSelected(slide.getSlideNumber());
// }
}
/* (non-Javadoc)
* @see java.awt.event.MouseAdapter#mousePressed(java.awt.event.MouseEvent)
*/
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
for (SlideSelectionListener listener : listeners.getListeners(SlideSelectionListener.class)) {
listener.slideSelected(slide.getSlideNumber());
}
}
});
}
/* (non-Javadoc)
* @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
*/
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
if (slideDrawn && slideImage != null) {
g.drawImage(slideImage, 0, 0, null);
}
else {
g2d.setColor(Color.WHITE);
g2d.fill(new Rectangle2D.Double(0, 0, getWidth(), getHeight()));
g2d.setColor(Color.LIGHT_GRAY);
g2d.draw(new Rectangle2D.Double(0, 0, getWidth(), getHeight()));
}
if (hovered) {
Stroke defaultStroke = g2d.getStroke();
g2d.setStroke(StrokeUtils.getBasicStroke(3.0f));
g2d.setColor(Color.BLUE);
g2d.draw(new Rectangle2D.Double(0, 0, getWidth(), getHeight()));
g2d.setStroke(defaultStroke);
}
System.out.println("PAINT WIDTH: " + getX() + ", "+ getY() + ":" + slide.getSlideNumber());
g.setFont(g.getFont().deriveFont(Font.BOLD));
int slideLabelWidth = FontUtils.getWidthOfText(g.getFontMetrics(), slideLabel);
g.drawString(slideLabel, getWidth() / 2 - slideLabelWidth / 2, getHeight() - 10);
super.paintComponent(g);
}
}
}