/*
* IconCell.java
*
* Created on December 16, 2002, 3:17 PM
*/
package kiyut.swing.shell.shelllistview;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;
/**
* Icon Cell that represent a cell in the <code>IconView</code> component
*
* @author Kiyut
*/
public class IconCell extends JComponent {
/** label for this component */
protected JLabel label;
/** image pane or icon pane for this component */
protected ImagePane imagePane;
/** editor for this component */
protected JComponent editor;
/** cell has focus for this component */
protected boolean cellHasFocus = false;
/** boolean value for editing status */
protected boolean editing = false;
/** icon view for this component */
protected IconView iconView;
/** Constructs a <code>IconCell</code> and initialize with the given parameter
* @param iconView an <code>IconView</code> object
*/
public IconCell(IconView iconView) {
this.iconView = iconView;
int width = 64;
imagePane = new ImagePane();
imagePane.setPreferredSize(new Dimension(width,32));
imagePane.setOpaque(false);
label = new JLabel();
label.setPreferredSize(new Dimension(width,20));
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setVerticalAlignment(SwingConstants.TOP);
label.setLabelFor(imagePane);
label.setText("filename");
label.setOpaque(false);
this.setLayout(new BorderLayout());
this.add(imagePane, BorderLayout.CENTER);
this.add(label, BorderLayout.SOUTH);
}
/** invoked to draw this component
* @param g the Graphics context in which to paint
*/
public void paintComponent(Graphics g) {
super.paintComponent(g);
label.setFont(iconView.getFont());
Insets insets = getInsets();
int x = insets.left;
int y = insets.top;
int w = getWidth() - insets.left - insets.right;
int h = getHeight() - insets.top - insets.bottom;
if (editing) {
label.setForeground(iconView.getForeground());
g.setColor(iconView.getBackground());
g.fillRect(x,y,w,h);
} else {
if (cellHasFocus) {
label.setForeground(iconView.getSelectionForeground());
g.setColor(iconView.getSelectionBackground());
g.fillRect(x,y,w,h);
} else {
label.setForeground(iconView.getForeground());
g.setColor(iconView.getBackground());
g.fillRect(x,y,w,h);
}
}
}
/** set the text for this component to display
* if the value of text is null or empty string, nothing is displayed.
* @param text a string to display
*/
public void setText(String text) {
label.setText(text);
}
/** Returns the text string that the label displays.
* @return a String
*/
public String getText() {
return label.getText();
}
/** set the image for this component to display
* if the value of image is null or empty string, nothing is displayed.
* @param image the image to display
*/
public void setImage(BufferedImage image) {
imagePane.setImage(image);
}
/** set the image rescale
* @param width the width to which to scale the image.
* @param height the height to which to scale the image.
*/
public void setImageRescale(double width, double height) {
imagePane.imageRescale(width,height);
}
/** set cell has focus
* @param cellHasFocus boolean value to set the focus of this component
*/
public void setCellHasFocus(boolean cellHasFocus) {
this.cellHasFocus = cellHasFocus;
}
/** return whether this component has focus or not
* @return true if this component has focus; otherwise false
*/
public boolean isCellHasFocus() {
return this.cellHasFocus;
}
/** Sets the editor to used by when this component is edited.
* @param editor the new cell editor
*/
public void setCellEditor(JComponent editor) {
this.editor = editor;
}
/** remove the cell editor used by this component */
public void removeCellEditor() {
this.editor = null;
}
/** Tells the editor to start editing
* @return true if editing was started; false otherwise
*/
public boolean startCellEditing() {
editing = true;
editor.setPreferredSize(label.getPreferredSize());
remove(label);
add(editor, BorderLayout.SOUTH);
editor.requestFocusInWindow();
return true;
}
/** Tells the editor to stop editing and accept any partially edited value as the value of the editor.
* @return true if editing was stopped; false otherwise
*/
public boolean stopCellEditing() {
editing = false;
this.remove(editor);
this.add(label, BorderLayout.SOUTH);
return true;
}
/** A component for the parent class to render an image */
private class ImagePane extends JPanel {
/** an image for this component */
private BufferedImage image;
/** the scale with for this component. */
private double scaleWidth = 1.0;
/** the scaleHeight for this component. */
private double scaleHeight = 1.0;
/** Constructs a <code>ImagePane</code> */
public ImagePane() { }
/** set the image for this component to display
* if the value of image is null or empty string, nothing is displayed.
* @param image the image to display
*/
public void setImage(BufferedImage image) {
this.image = image;
}
/** set the image rescale
* @param width the width to which to scale the image.
* @param height the height to which to scale the image.
*/
public void imageRescale(double width, double height) {
this.scaleWidth = width;
this.scaleHeight = height;
}
/** invoked to draw this component
* @param g the Graphics context in which to paint
*/
public void paintComponent(Graphics g) {
super.paintComponent(g); // paint background
if (image == null) {
return;
}
Graphics2D g2 = (Graphics2D) g;
double w = image.getWidth() *scaleWidth;
double h = image.getHeight() *scaleHeight;
Dimension dim = getSize();
double x = 0;
double y = 0;
if (dim.getWidth() > w) {
x = (dim.getWidth() - w)/2;
}
if (dim.getHeight() > h) {
y = (dim.getHeight() - h)/2;
}
g2.drawImage(image,(int)x,(int)y,(int)w,(int)h,this);
}
}
}