/* TagComparisonTable.java created 2007-12-04
*
*/
package org.signalml.app.view.tag.comparison;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.TableColumnModelEvent;
import javax.swing.table.TableModel;
import org.apache.log4j.Logger;
import org.signalml.app.action.components.ExportToClipboardAction;
import org.signalml.app.action.document.ExportToFileAction;
import org.signalml.app.model.components.TableToTextExporter;
import org.signalml.app.model.components.WriterExportableTable;
import org.signalml.app.view.common.components.cellrenderers.CenteringTableCellRenderer;
import org.signalml.app.view.tag.TagIconProducer;
import org.signalml.app.view.workspace.ViewerFileChooser;
import org.signalml.plugin.export.signal.TagStyle;
/** TagComparisonTable
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class TagComparisonTable extends JTable {
protected static final Logger logger = Logger.getLogger(TagComparisonTable.class);
private static final long serialVersionUID = 1L;
public static final Color DISABLED_COLOR = new Color(220,220,220);
private static final int CELL_SIZE = 62;
private TagIconProducer tagIconProducer;
private TagStyleTableCellRenderer tagStyleTableCellRenderer;
private TableToTextExporter tableToTextExporter;
private ViewerFileChooser fileChooser;
private JPopupMenu popupMenu;
private CornerPanel cornerPanel;
public TagComparisonTable(TagComparisonTableModel model) {
super(model);
setTableHeader(null);
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setDefaultRenderer(String.class, new CenteringTableCellRenderer());
tagStyleTableCellRenderer = new TagStyleTableCellRenderer();
setCellSelectionEnabled(true);
setAutoResizeMode(AUTO_RESIZE_OFF);
setRowHeight(CELL_SIZE);
setToolTipText("");
}
public TagIconProducer getTagIconProducer() {
return tagIconProducer;
}
public void setTagIconProducer(TagIconProducer tagIconProducer) {
this.tagIconProducer = tagIconProducer;
tagStyleTableCellRenderer.setTagIconProducer(tagIconProducer);
}
public TableToTextExporter getTableToTextExporter() {
return tableToTextExporter;
}
public void setTableToTextExporter(TableToTextExporter tableToTextExporter) {
this.tableToTextExporter = tableToTextExporter;
}
public ViewerFileChooser getFileChooser() {
return fileChooser;
}
public void setFileChooser(ViewerFileChooser fileChooser) {
this.fileChooser = fileChooser;
}
@Override
public TagComparisonTableModel getModel() {
return (TagComparisonTableModel) super.getModel();
}
@Override
protected void configureEnclosingScrollPane() {
super.configureEnclosingScrollPane();
TableModel model = getModel();
if (!(model instanceof TagComparisonTableModel)) {
return;
}
TagComparisonTableModel tableModel = (TagComparisonTableModel) model;
Container p = getParent();
if (p instanceof JViewport) {
Container gp = p.getParent();
if (gp instanceof JScrollPane) {
JScrollPane scrollPane = (JScrollPane)gp;
JViewport viewport = scrollPane.getViewport();
if (viewport == null || viewport.getView() != this) {
return;
}
scrollPane.setColumnHeaderView(new HeaderTable(tableModel.getColumnTableModel()));
scrollPane.setRowHeaderView(new HeaderTable(tableModel.getRowTableModel()));
scrollPane.setCorner(ScrollPaneConstants.UPPER_LEFT_CORNER, getCornerPanel());
}
}
}
private CornerPanel getCornerPanel() {
if (cornerPanel == null) {
cornerPanel = new CornerPanel();
}
return cornerPanel;
}
public void setCornerPanelText(String text) {
getCornerPanel().getLabel().setText(text);
}
@Override
protected void unconfigureEnclosingScrollPane() {
super.unconfigureEnclosingScrollPane();
Container p = getParent();
if (p instanceof JViewport) {
Container gp = p.getParent();
if (gp instanceof JScrollPane) {
JScrollPane scrollPane = (JScrollPane)gp;
JViewport viewport = scrollPane.getViewport();
if (viewport == null || viewport.getView() != this) {
return;
}
scrollPane.setColumnHeaderView(null);
scrollPane.setRowHeaderView(null);
scrollPane.setCorner(ScrollPaneConstants.UPPER_LEFT_CORNER, null);
}
}
}
@Override
public void columnAdded(TableColumnModelEvent e) {
super.columnAdded(e);
int index = e.getToIndex();
getColumnModel().getColumn(index).setPreferredWidth(CELL_SIZE);
}
@Override
public String getToolTipText(MouseEvent event) {
Point p = event.getPoint();
int row = rowAtPoint(p);
int col = columnAtPoint(p);
if (row >= 0 && col >= 0) {
return (String) getValueAt(row, col);
} else {
return null;
}
}
@Override
public JPopupMenu getComponentPopupMenu() {
if (popupMenu == null) {
popupMenu = new JPopupMenu();
popupMenu.add(new ExportComparisonToClipboardAction(tableToTextExporter));
popupMenu.add(new ExportComparisonToFileAction(tableToTextExporter));
}
return popupMenu;
}
protected class ExportComparisonToClipboardAction extends ExportToClipboardAction {
private static final long serialVersionUID = 1L;
public ExportComparisonToClipboardAction(TableToTextExporter tableToTextExporter) {
super(tableToTextExporter);
}
@Override
protected Object getUserObject() {
TagComparisonTableModel model = getModel();
if (model != null) {
return model.isShowPercent();
}
return null;
}
@Override
protected WriterExportableTable getExportableTable() {
TagComparisonTableModel model = getModel();
if (model != null) {
return model.getResult();
}
return null;
}
}
protected class ExportComparisonToFileAction extends ExportToFileAction {
private static final long serialVersionUID = 1L;
private ExportComparisonToFileAction(TableToTextExporter tableToTextExporter) {
super(tableToTextExporter);
setFileChooser(fileChooser);
setOptionPaneParent(TagComparisonTable.this);
}
@Override
protected Object getUserObject() {
TagComparisonTableModel model = getModel();
if (model != null) {
return model.isShowPercent();
}
return null;
}
@Override
protected WriterExportableTable getExportableTable() {
TagComparisonTableModel model = getModel();
if (model != null) {
return model.getResult();
}
return null;
}
}
private class CornerPanel extends JPanel {
private static final long serialVersionUID = 1L;
private JLabel label;
public CornerPanel() {
super(new BorderLayout());
setBackground(DISABLED_COLOR);
setPreferredSize(new Dimension(CELL_SIZE,CELL_SIZE));
label = new JLabel();
label.setHorizontalAlignment(JLabel.CENTER);
label.setVerticalAlignment(JLabel.CENTER);
add(label, BorderLayout.CENTER);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension size = getSize();
g.setColor(getGridColor());
g.drawLine(0, size.height-1, size.width-1, size.height-1);
g.drawLine(size.width-1, 0, size.width-1, size.height-1);
}
public JLabel getLabel() {
return label;
}
@Override
public JPopupMenu getComponentPopupMenu() {
return TagComparisonTable.this.getComponentPopupMenu();
}
}
private class HeaderTable extends JTable {
private static final long serialVersionUID = 1L;
public HeaderTable(TableModel dm) {
super(dm);
setTableHeader(null);
setDefaultRenderer(TagStyle.class, tagStyleTableCellRenderer);
setBackground(DISABLED_COLOR);
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setEnabled(false);
setAutoResizeMode(AUTO_RESIZE_OFF);
setRowHeight(CELL_SIZE);
setToolTipText("");
}
@Override
public String getToolTipText(MouseEvent event) {
Point p = event.getPoint();
int row = rowAtPoint(p);
int col = columnAtPoint(p);
if (row >= 0 && col >= 0) {
Object value = getValueAt(row, col);
if (value == null) {
return null;
}
if (value instanceof String) {
return (String) value;
}
else if (value instanceof TagStyle) {
return ((TagStyle) value).getDescriptionOrName();
}
}
return null;
}
@Override
public void columnAdded(TableColumnModelEvent e) {
super.columnAdded(e);
int index = e.getToIndex();
getColumnModel().getColumn(index).setPreferredWidth(CELL_SIZE);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(getColumnCount()*CELL_SIZE, getRowCount()*CELL_SIZE);
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return getPreferredSize();
}
@Override
public JPopupMenu getComponentPopupMenu() {
return TagComparisonTable.this.getComponentPopupMenu();
}
}
}