package org.wordcorr.gui;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import org.wordcorr.db.Alignment;
/**
* Table that allows designated column to have aligned characters.
*
* @author Jim Shiba
**/
public class AlignedTable extends JTable {
/**
* Constructor.
**/
public AlignedTable(TableModel dm, int column) {
this(dm, column, new AlignedTableCellRenderer());
}
/**
* Constructor.
**/
public AlignedTable(TableModel dm, int column, AlignedTableCellRenderer renderer) {
super (dm);
_column = column;
_alignedRenderer = renderer;
getColumnModel().getColumn(column).setCellRenderer(renderer);
}
// /**
// * Get cell renderer for designated column.
// **/
// public TableCellRenderer getCellRenderer(int row, int column) {
// if (column == _column) {
// return _alignedRenderer;
// }
// return super.getCellRenderer(row, column);
// }
/**
* Set number of character widths for each position
* from row data list and data extractor.
**/
public void setAlignedPositionWidths(List rows, AlignedDataExtractor extractor) {
List maxWidths = new ArrayList();
for (Iterator it = rows.iterator(); it.hasNext();) {
String data = extractor.getColumnData(it.next());
// skip non grapheme cluster data
if (data.indexOf(Alignment.GRAPHEME_CLUSTER_START) == -1)
continue;
// extract widths
Integer one = new Integer(1);
boolean gc = false;
int pos = 0;
int width = 0;
for (int i = 0; i < data.length(); i++) {
switch (data.charAt(i)) {
case Alignment.GRAPHEME_CLUSTER_START :
gc = true;
break;
case Alignment.GRAPHEME_CLUSTER_END :
// initialize
if (pos >= maxWidths.size())
maxWidths.add(one);
if (width > ((Integer)maxWidths.get(pos)).intValue())
maxWidths.set(pos, new Integer(width));
pos++;
width = 0;
gc = false;
break;
default :
if (!gc) {
// initialize
if (pos >= maxWidths.size())
maxWidths.add(one);
pos++;
} else {
// grapheme cluster
width++;
}
break;
}
}
}
if (maxWidths.isEmpty()) {
setAlignedPositionWidths(null);
} else {
// convert to int array
int[] positionWidth = new int[maxWidths.size()];
int i = 0;
for (Iterator it = maxWidths.iterator(); it.hasNext();) {
positionWidth[i++] = ((Integer)it.next()).intValue();
}
setAlignedPositionWidths(positionWidth);
}
}
/**
* Set number of character widths for each position.
**/
public void setAlignedPositionWidths(int[] positionWidth) {
_alignedRenderer.setPositionWidths(positionWidth);
}
int _column;
AlignedTableCellRenderer _alignedRenderer;
}