/*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) Alkacon Software GmbH (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.applet.upload;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
/**
* Image preview for the file select box.<p>
*
* Based on the Java 1.4 example.<p>
*
* @since 6.0.0
*/
public class ImagePreview extends JComponent implements PropertyChangeListener {
private static final int C_MODE_EMPTY = 0;
private static final int C_MODE_IMAGE = 1;
private static final int C_MODE_TEXT = 2;
/** Serial version UID required for safe serialization. */
private static final long serialVersionUID = 4851280416316056303L;
private File m_file;
private Font m_font;
private String m_messageNoPreview;
private int m_mode;
private String[] m_text;
private ImageIcon m_thumbnail;
/**
* Constructor, creates a new ImagePreview.<p>
*
* @param fc The fileselector box
* @param messageNoPreview localized message for no preview
*/
public ImagePreview(JFileChooser fc, String messageNoPreview) {
setPreferredSize(new Dimension(200, 100));
fc.addPropertyChangeListener(this);
m_font = new java.awt.Font(null, Font.PLAIN, 9);
m_messageNoPreview = messageNoPreview;
m_mode = C_MODE_EMPTY;
}
/**
* Loads the image for the preview.<p>
*/
public void loadImage() {
if (m_file == null) {
m_thumbnail = null;
return;
}
// load the image
ImageIcon tmpIcon = new ImageIcon(m_file.getPath());
if (tmpIcon.getIconWidth() > 190) {
// scale it to the maximum width of 190 pixel if newscessary
m_thumbnail = new ImageIcon(tmpIcon.getImage().getScaledInstance(190, -1, Image.SCALE_DEFAULT));
} else { //no need to miniaturize
m_thumbnail = tmpIcon;
}
}
/**
* @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
*/
public void paintComponent(Graphics g) {
if (m_mode == C_MODE_IMAGE) {
// if we are in image mode, draw the image
if (m_thumbnail == null) {
loadImage();
}
if (m_thumbnail != null) {
int x = getWidth() / 2 - m_thumbnail.getIconWidth() / 2;
int y = getHeight() / 2 - m_thumbnail.getIconHeight() / 2;
if (y < 0) {
y = 0;
}
if (x < 5) {
x = 5;
}
m_thumbnail.paintIcon(this, g, x, y);
}
} else if (m_mode == C_MODE_TEXT) {
// if we are in text mode, draw the text preview
g.setColor(Color.white);
g.fillRect(10, 0, getWidth() - 1, getHeight() - 1);
g.setColor(Color.black);
g.drawRect(10, 0, getWidth() - 11, getHeight() - 1);
g.setFont(m_font);
for (int i = 0; i < 35; i++) {
if (m_text[i] != null) {
g.drawString(m_text[i], 13, (i + 1) * 11);
}
}
} else {
g.setColor(Color.black);
g.setFont(m_font);
g.drawString(m_messageNoPreview, 30, getHeight() / 2);
}
}
/**
* Exchange the image if a new file is selected in the fileselector box.<p>
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent e) {
boolean update = false;
String prop = e.getPropertyName();
if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(prop)) {
// if the directory changed, don't show an image
m_file = null;
m_text = null;
update = true;
m_mode = C_MODE_EMPTY;
} else if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(prop)) {
// if a file was selected, find out which one
m_file = (File)e.getNewValue();
m_mode = getMode();
update = true;
}
// update the preview accordingly
if (update) {
m_thumbnail = null;
if (isShowing()) {
if (m_mode == (C_MODE_IMAGE)) {
loadImage();
repaint();
} else if (m_mode == (C_MODE_TEXT)) {
loadText();
repaint();
} else {
repaint();
}
}
}
}
/**
* Gets the preview draw mode, depending on the file extension.<p>
*
* @return preview draw mode
*/
private int getMode() {
int mode = C_MODE_EMPTY;
String extension = FileUploadUtils.getExtension(m_file);
if (FileUploadUtils.isImageExtension(extension)) {
mode = C_MODE_IMAGE;
} else if (FileUploadUtils.isTextExtension(extension)) {
mode = C_MODE_TEXT;
}
return mode;
}
/**
* Reads the first 10 lines of e text file.<p>
*/
private void loadText() {
m_text = new String[35];
BufferedReader fileStream = null;
try {
fileStream = new BufferedReader(new FileReader(m_file));
for (int i = 0; i < 35; i++) {
m_text[i] = fileStream.readLine();
}
} catch (Exception e) {
// ignore
} finally {
try {
if (fileStream != null) {
fileStream.close();
}
} catch (IOException e) {
// ignore
}
}
}
}