package org.openswing.swing.table.editors.client;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.table.*;
import org.openswing.swing.client.*;
import org.openswing.swing.logger.client.*;
import org.openswing.swing.mdi.client.*;
import org.openswing.swing.table.client.*;
import org.openswing.swing.util.client.*;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Column editor used to show an image and select and import an image from file system.</p>
* <p>Copyright: Copyright (C) 2006 Mauro Carniel</p>
*
* <p> This file is part of OpenSwing Framework.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the (LGPL) Lesser General Public
* License as published by the Free Software Foundation;
*
* GNU LESSER GENERAL PUBLIC LICENSE
* Version 2.1, February 1999
*
* 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* The author may be contacted at:
* maurocarniel@tin.it</p>
*
* @author Mauro Carniel
* @version 1.0
*/
public class ImageCellEditor extends AbstractCellEditor implements TableCellEditor {
/** button inside the editable cell */
/** selection button; used to select an image file from local file system */
private JButton selButton = new JButton() {
public void paint(Graphics g) {
super.paint(g);
int width = g.getFontMetrics().stringWidth("...");
if (isEnabled())
g.setColor(UIManager.getColor("Button.foreground"));
else
g.setColor(UIManager.getColor("Button.disabledForeground"));
g.drawString("...", (this.getWidth()-width+1)/2, this.getHeight()/2+4);
}
};
/** cell content */
private ImagePanel imagePanel = new ImagePanel();
private JPanel cell = new JPanel();
private GridBagLayout gridBagLayout1 = new GridBagLayout();
/** table */
private JTable table = null;
/** current row index */
private int row = -1;
/** current column index */
private int col = -1;
/**
* Constructor.
* @param text button text
* @param actionListeners list of ActionListeners linked to the button
*/
public ImageCellEditor(boolean showButton,final FileFilter fileFilter,final ArrayList listeners,final boolean showPreview) {
cell.setLayout(gridBagLayout1);
cell.add(imagePanel, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
imagePanel.setScrollBarsPolicy(ImagePanel.SCROLLBAR_NEVER);
cell.setFocusable(true);
selButton.setPreferredSize(new Dimension(21, 20));
selButton.setMinimumSize(new Dimension(21, 20));
selButton.setMaximumSize(new Dimension(21, 20));
selButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser f = new JFileChooser();
f.setDialogTitle(ClientSettings.getInstance().getResources().getResource("image selection"));
Container c = cell.getParent();
while(c!=null && !(c instanceof JFrame || c instanceof JInternalFrame))
c = c.getParent();
if (c==null)
c = MDIFrame.getInstance();
f.setFileSelectionMode(f.FILES_ONLY);
if (showPreview) {
final PreviewImage ip = new PreviewImage();
f.setAccessory(ip);
ip.setPreferredSize(new Dimension(100,100));
ip.setBorder(BorderFactory.createEtchedBorder());
f.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
try {
if (evt.getPropertyName().equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) {
ip.setImage((File) evt.getNewValue());
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
});
}
if (fileFilter!=null)
f.setFileFilter(fileFilter);
int res = f.showOpenDialog(c);
if (res==f.APPROVE_OPTION) {
// image file selected: it will be set into image panel...
try {
imagePanel.setImageAsStream(new FileInputStream(f.getSelectedFile()));
if (table!=null && table instanceof Grid && !((Grid)table).isRowHeightFixed() && row!=-1 && col!=-1)
table.setRowHeight(row,imagePanel.getImageHeight());
if (row!=-1 && col!=-1) {
table.getModel().setValueAt(imagePanel.getImage(),row,col);
}
for(int i=0;i<listeners.size();i++)
((ActionListener)listeners.get(i)).actionPerformed(new ActionEvent(ImageCellEditor.this,e.getID(),f.getSelectedFile().getAbsolutePath()));
}
catch (Exception ex) {
Logger.error("org.openswing.swing.client.ImageControl","actionPerformed",ex.getMessage(),ex);
OptionPane.showMessageDialog(c,"Error",ex.getMessage(),JOptionPane.ERROR_MESSAGE);
}
}
}
});
if (showButton)
cell.add(selButton, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0, 5, 0, 0), 0, 0));
}
/**
* Stop cell editing. This method stops cell editing (effectively committing the edit) only if the data entered is validated successfully.
* @return <code>true</code> if cell editing may stop, and <code>false</code> otherwise.
*/
public final boolean stopCellEditing() {
return true;
}
public final Object getCellEditorValue() {
return imagePanel.getImage();
}
public final Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row,
int column) {
this.table = table;
this.row = row;
this.col = column;
imagePanel.setImage((byte[])value);
if (table instanceof Grid && !((Grid)table).isCellEditable(row,column))
return imagePanel;
else
return cell;
}
public final void finalize() {
table = null;
}
class PreviewImage extends JLabel {
public PreviewImage() {
setPreferredSize(new Dimension(100,100));
setBorder(BorderFactory.createEtchedBorder());
}
public void setImage(File f) {
ImageIcon icon = new ImageIcon(f.getPath());
if (icon.getIconWidth()>getWidth())
icon = new ImageIcon(icon.getImage().getScaledInstance(getWidth(),-1,Image.SCALE_DEFAULT));
setIcon(icon);
repaint();
}
}
}