package org.swingml.tablebrowser.ext;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import javax.swing.table.*;
import org.swingml.*;
import org.swingml.component.*;
import org.swingml.event.*;
import org.swingml.model.*;
import org.swingml.model.TableColumnModel;
/**
* @author NumberSix
*/
public class IconComponentCellEditor extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {
private class IconMouseListener implements MouseListener {
private IconModel model;
private TableBrowserComponent tableBrowser;
public IconMouseListener (IconModel iconModel, TableBrowserComponent table) {
model = iconModel;
tableBrowser = table;
}
public void mouseClicked (MouseEvent e) {
String eventName = Constants.MOUSE_SINGLE_CLICKED;
switch (e.getClickCount()) {
case 1:
eventName = Constants.MOUSE_SINGLE_CLICKED;
break;
case 2:
eventName = Constants.MOUSE_DOUBLE_CLICKED;
break;
}
EventHandler.getInstance().handleEvent(model, eventName, tableBrowser);
}
public void mouseEntered (MouseEvent e) {}
public void mouseExited (MouseEvent e) {}
public void mousePressed (MouseEvent e) {}
public void mouseReleased (MouseEvent e) {}
}
public IconComponentCellEditor () {}
public Object getCellEditorValue () {
return null;
}
public Component getTableCellEditorComponent (JTable table, Object value, boolean isSelected, int row, int column) {
return getTableCellRendererComponent(table, value, isSelected, true, row, column);
}
public Component getTableCellRendererComponent (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
JPanel result = new JPanel();
result.setBackground(Color.WHITE);
result.setBorder(BorderFactory.createEmptyBorder());
if (isSelected || hasFocus) {
result.setBackground(table.getSelectionBackground());
result.setForeground(table.getSelectionForeground());
}
FlowLayout layout = (FlowLayout) result.getLayout();
final TableBrowserComponent tableBrowser = (TableBrowserComponent) table;
final JTableModel model = (JTableModel) table.getModel();
TableDataModel cellModel = model.getDataModel(tableBrowser.convertRowIndexToModel(row), tableBrowser.convertColumnIndexToModel(column));
if (!isSelected) {
// Do we have foreground/background colors to set?
if (cellModel.getBackground() != null) {
result.setBackground(cellModel.getBackground());
}
if (cellModel.getForeground() != null) {
result.setForeground(cellModel.getForeground());
}
}
// Look at column model and default this to the column model's ALIGN attribute instead of hard coding it.
int columnInModel = table.convertColumnIndexToModel(column);
TableColumnModel columnModel = (TableColumnModel) model.getColumns().get(columnInModel);
String columnAlignment = columnModel.getAlignment();
layout.setAlignment(FlowLayout.LEFT);
if (columnAlignment != null) {
if (columnAlignment.equals(Constants.CENTER)) {
layout.setAlignment(FlowLayout.CENTER);
} else if (columnAlignment.equals(Constants.RIGHT)) {
layout.setAlignment(FlowLayout.RIGHT);
}
}
layout.setVgap(0);
result.setLayout(layout);
// add this to fire events on the panel
result.addMouseListener(new MouseListener() {
public void mouseClicked (MouseEvent e) {
String eventName = Constants.MOUSE_SINGLE_CLICKED;
switch (e.getClickCount()) {
case 1:
eventName = Constants.MOUSE_SINGLE_CLICKED;
break;
case 2:
eventName = Constants.MOUSE_DOUBLE_CLICKED;
break;
}
EventHandler.getInstance().handleEvent(model, eventName, tableBrowser);
}
public void mouseEntered (MouseEvent e) {}
public void mouseExited (MouseEvent e) {}
public void mousePressed (MouseEvent e) {}
public void mouseReleased (MouseEvent e) {}
});
if (cellModel.hasIcons()) {
List iconModels = cellModel.getChildren();
if (iconModels != null && iconModels.size() > 0) {
Iterator schmiterator = iconModels.iterator();
while (schmiterator.hasNext()) {
IconModel iconModel = (IconModel) schmiterator.next();
JLabel icon = new JLabel();
icon.addMouseListener(new IconMouseListener(iconModel, tableBrowser));
// set icon
if (iconModel.getIcon() != null) {
ImageIcon icon2 = IconFactory.getIcon(iconModel);
if (icon2 != null) {
icon.setIcon(icon2);
}
} else {
icon.setText(iconModel.getText());
}
if (!isSelected) {
// Do we have foreground/background colors to set?
if (cellModel.getForeground() != null) {
icon.setForeground(cellModel.getForeground());
}
if (iconModel.getForeground() != null) {
icon.setForeground(iconModel.getForeground());
}
}
if (iconModel.getTooltip() != null && iconModel.getTooltip().length() > 0) {
icon.setToolTipText(iconModel.getTooltip());
}
Font font = table.getFont();
Font iconFont = new Font(font.getName(), Font.PLAIN, font.getSize());
icon.setFont(iconFont);
if (isSelected || hasFocus) {
icon.setBackground(table.getSelectionBackground());
icon.setForeground(table.getSelectionForeground());
}
if (!table.isEnabled()) {
icon.setForeground(Color.LIGHT_GRAY);
}
result.add(icon);
}
}
}
return result;
}
}