package jetbrains.mps.workbench.dialogs.project.components.parts.diffrowtable; /*Generated by MPS */ import javax.swing.JTable; import java.awt.Point; import javax.swing.table.TableCellRenderer; import java.awt.Component; import javax.swing.table.TableModel; import java.awt.Rectangle; import javax.swing.table.TableColumn; import java.util.Enumeration; import java.awt.Dimension; import javax.swing.event.ListSelectionEvent; public class DiffRowTable extends JTable { public DiffRowTable() { setUI(new BasicDiffRowTableUI()); } @Override public int rowAtPoint(Point point) { int y = point.y; int rowSpacing = getIntercellSpacing().height; int rowCount = getRowCount(); int rowHeight = 0; for (int row = 0; row < rowCount; row++) { rowHeight += getRowHeight(row) + rowSpacing; if (y < rowHeight) { return row; } } return -1; } public int getHeight(Object obj, int colNum) { TableCellRenderer tcr = getColumnModel().getColumn(colNum).getCellRenderer(); if (tcr != null) { Component rendererComponent = tcr.getTableCellRendererComponent(this, obj, true, true, 0, 0); return (int) Math.round(rendererComponent.getPreferredSize().getHeight()); } return getRowHeight(); } @Override public int getRowHeight() { return getFontMetrics(getFont()).getHeight(); } @Override public int getRowHeight(int row) { TableModel tm = getModel(); int height = getFontMetrics(getFont()).getHeight(); for (int i = 0; i < getColumnModel().getColumnCount(); i++) { try { height = Math.max(height, getHeight(tm.getValueAt(row, i), i)); } catch (Exception e) { } } return height; } @Override public Rectangle getCellRect(int row, int column, boolean includeSpacing) { Rectangle cellFrame; TableColumn aColumn; cellFrame = new Rectangle(); cellFrame.height = getRowHeight(row) + rowMargin; cellFrame.y = 0; for (int i = 0; i < row; i++) { cellFrame.y += getRowHeight(i) + rowMargin; } int index = 0; int columnMargin = getColumnModel().getColumnMargin(); Enumeration enumeration = getColumnModel().getColumns(); while (enumeration.hasMoreElements()) { aColumn = (TableColumn) enumeration.nextElement(); cellFrame.width = aColumn.getWidth() + columnMargin; if (index == column) { break; } cellFrame.x += cellFrame.width; index++; } if (!(includeSpacing)) { Dimension spacing = getIntercellSpacing(); cellFrame.setBounds(cellFrame.x + spacing.width / 2, cellFrame.y + spacing.height / 2, cellFrame.width - spacing.width, cellFrame.height - spacing.height); } return cellFrame; } @Override public void columnSelectionChanged(ListSelectionEvent e) { repaint(); } @Override public void valueChanged(ListSelectionEvent e) { int firstIndex = e.getFirstIndex(); int lastIndex = e.getLastIndex(); if (firstIndex == -1 && lastIndex == -1) { repaint(); } Rectangle dirtyRegion = getCellRect(firstIndex, 0, false); int numColumns = getColumnCount(); int index = firstIndex; for (int i = 0; i < numColumns; i++) { dirtyRegion.add(getCellRect(index, i, false)); } index = lastIndex; for (int i = 0; i < numColumns; i++) { dirtyRegion.add(getCellRect(index, i, false)); } repaint(dirtyRegion.x, dirtyRegion.y, dirtyRegion.width, dirtyRegion.height); } }