/* * Copyright (C) 2013-2015, VistaTEC or third-party contributors as indicated * by the @author tags or express copyright attribution statements applied by * the authors. All third-party contributions are distributed under license by * VistaTEC. * * This file is part of Ocelot. * * Ocelot 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 3 of the License, or * (at your option) any later version. * * Ocelot 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. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, write to: * * Free Software Foundation, Inc. * 51 Franklin Street, Fifth Floor * Boston, MA 02110-1301 * USA * * Also, see the full LGPL text here: <http://www.gnu.org/copyleft/lesser.html> */ package com.vistatec.ocelot.segment.view; import com.vistatec.ocelot.segment.model.SegmentVariant; import com.vistatec.ocelot.segment.model.OcelotSegment; import java.awt.Component; import java.awt.Dimension; import java.awt.FontMetrics; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextPane; import javax.swing.UIManager; import javax.swing.event.ChangeEvent; import javax.swing.event.ListSelectionEvent; import javax.swing.event.TableColumnModelEvent; import javax.swing.event.TableColumnModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Detail view showing the raw source and target segment text. */ public class SegmentDetailView extends JScrollPane { private static final long serialVersionUID = 1L; private Logger LOG = LoggerFactory.getLogger(SegmentDetailView.class); private JTable table; private DetailTableModel tableModel; public SegmentDetailView() { tableModel = new DetailTableModel(); table = new JTable(tableModel); table.getTableHeader().setReorderingAllowed(false); table.setDefaultRenderer(String.class, new TextRenderer()); TableColumnModel tableColumnModel = table.getColumnModel(); tableColumnModel.getColumn(0).setMinWidth(15); tableColumnModel.getColumn(0).setPreferredWidth(60); tableColumnModel.getColumn(0).setMaxWidth(100); tableColumnModel.addColumnModelListener(new TableColumnModelListener() { @Override public void columnAdded(TableColumnModelEvent tcme) {} @Override public void columnRemoved(TableColumnModelEvent tcme) {} @Override public void columnMoved(TableColumnModelEvent tcme) {} @Override public void columnMarginChanged(ChangeEvent ce) { updateRowHeights(); } @Override public void columnSelectionChanged(ListSelectionEvent lse) {} }); setViewportView(table); } public void setSegment(OcelotSegment selectedSegment) { tableModel.setSegment(selectedSegment); updateRowHeights(); } public void clearDisplay() { setViewportView(null); } protected void updateRowHeights() { setViewportView(null); FontMetrics font = table.getFontMetrics(table.getFont()); int rowHeight = font.getHeight(); for (int row = 0; row < DetailTableModel.SEGMENTROWS; row++) { SegmentTextCell segmentCell = SegmentTextCell.createCell(); segmentCell.setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); if (tableModel.hasSegment()) { rowHeight = getLabelRowHeight(tableModel.getValueAt(row, 0).toString(), table.getColumnModel().getColumn(0).getWidth(), row); for (int col = 1; col < 2; col++) { int width = table.getColumnModel().getColumn(col).getWidth(); SegmentVariant sv = (SegmentVariant) tableModel.getValueAt(row, col); segmentCell.setVariant(row, sv, true); // Need to set width to force text area to calculate a pref height segmentCell.setSize(new Dimension(width, table.getRowHeight(row))); rowHeight = Math.max(rowHeight, segmentCell.getPreferredSize().height); } table.setRowHeight(row, rowHeight); } } for (int row = DetailTableModel.SEGMENTROWS; row < table.getRowCount(); row++) { String detailLabel = tableModel.getValueAt(row, 0).toString(); int width = table.getColumnModel().getColumn(0).getWidth(); table.setRowHeight(row, getLabelRowHeight(detailLabel, width, row)); } setViewportView(table); } public int getLabelRowHeight(String label, int colWidth, int row) { JTextPane jtp = new JTextPane(); jtp.setText(label); // Need to set width to force text area to calculate a pref height jtp.setSize(new Dimension(colWidth, table.getRowHeight(row))); return jtp.getPreferredSize().height; } public class DetailTableModel extends AbstractTableModel { private static final long serialVersionUID = 1L; public static final int SEGMENTROWS = 3; private String[] column = {"Label", "Segments"}; private String[] rowName = {"Source:", "Target:", "Original Target:", "Edit Distance: "}; private OcelotSegment segment; public void setSegment(OcelotSegment seg) { segment = seg; } public boolean hasSegment() { return segment != null; } @Override public int getRowCount() { return segment != null ? 4 : 0; } @Override public String getColumnName(int col) { return column[col]; } @Override public Class<?> getColumnClass(int col) { return (col == 0) ? String.class : SegmentVariant.class; } @Override public int getColumnCount() { return 2; } @Override public Object getValueAt(int row, int col) { if (segment != null) { switch(row) { case 0: return col == 0 ? rowName[row] : segment.getSource(); case 1: return col == 0 ? rowName[row] : segment.getTarget(); case 2: return col == 0 ? rowName[row] : segment.getOriginalTarget(); case 3: if (col == 0) { return rowName[row]; } return segment.getEditDistance(); default: LOG.warn("Invalid row for SegmentDetailView '"+row+"'"); break; } } return null; } @Override public boolean isCellEditable(int row, int col) { return false; } } public class TextRenderer implements TableCellRenderer { @Override public Component getTableCellRendererComponent(JTable jtable, Object o, boolean isSelected, boolean hasFocus, int row, int col) { SegmentTextCell renderTextPane = SegmentTextCell.createCell(); if (tableModel.getRowCount() > row) { if (col > 0) { if (row > 2) { Integer editDistance = (Integer) tableModel.getValueAt(row, col); renderTextPane.setText(editDistance.toString()); } else { renderTextPane.setVariant(row, (SegmentVariant) o, true); } } else { String s = (String)tableModel.getValueAt(row, col); renderTextPane.setText(s); } renderTextPane.setBackground(isSelected ? jtable.getSelectionBackground() : jtable.getBackground()); renderTextPane.setForeground(isSelected ? jtable.getSelectionForeground() : jtable.getForeground()); renderTextPane.setBorder(hasFocus ? UIManager.getBorder("Table.focusCellHighlightBorder") : jtable.getBorder()); } return renderTextPane; } } }