package org.wordcorr.gui;
import java.awt.Font;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.*;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.wordcorr.AppProperties;
import org.wordcorr.BeanCatalog;
import org.wordcorr.db.Cluster;
import org.wordcorr.db.CorrespondenceSet;
import org.wordcorr.db.Database;
import org.wordcorr.db.DatabaseException;
import org.wordcorr.db.Group;
import org.wordcorr.io.InfinitePipeInputStream;
import org.wordcorr.io.InfinitePipeOutputStream;
import org.wordcorr.db.Protosegment;
import org.wordcorr.db.RetrieveAllParameters;
import org.wordcorr.db.SummaryFile;
import org.wordcorr.db.Setting;
import org.wordcorr.db.User;
import org.wordcorr.db.View;
import org.wordcorr.db.WordCollection;
import org.wordcorr.db.XMLFile;
import org.wordcorr.db.Zone;
import org.wordcorr.gui.action.WordCorrAction;
import org.wordcorr.gui.input.InputRow;
import org.wordcorr.gui.input.MultiSorter;
/**
* Pane for doing tabulation refinement.
* @author Jim Shiba
**/
class RefinePane extends ButtonPanel implements Refreshable {
private static final String[] COL_KEYS =
{
"lblRefineTableZone",
"lblRefineTableProtosegment",
"lblRefineTableEnvironment",
"lblRefineTableClusterOrder",
"lblRefineTableCorrespondenceSet",
"lblRefineTableCitationCount",
"lblRefineTableCitation",
"lblBlank" };
/**
* Constructor.
**/
RefinePane(WordCollection collection) {
super(new JPanel(new BorderLayout()));
_collection = collection;
// do the list selection for this table
final JPanel panel = (JPanel) getMainComponent();
addButtons();
// create interface table
_tableModel = new RefineTableModel();
_table = new AlignedTable(_tableModel, 4, new RefineCellAlignedRenderer());
_table.setRowHeight(
new Double(
Math.ceil(
new JTextField().getFont().getSize()
* Double.parseDouble(AppProperties.getProperty("RowHeightFactor"))
+ _table.getRowMargin() * 2))
.intValue());
_table.setDefaultRenderer(Object.class, new RefineCellRenderer());
_table.getColumnModel().getColumn(1).setCellRenderer(new RefineCellRenderer(FontCache.getIPA()));
_table.getColumnModel().getColumn(2).setCellRenderer(new RefineCellRenderer(FontCache.getIPA()));
// set initial column widths
_table.setAutoCreateColumnsFromModel(false);
int[] colWidth = { 200, 25, 75, 15, 250, 10, 75, 5 };
for (int i = 0; i < 8; i++) {
TableColumn col = _table.getColumnModel().getColumn(i);
col.setPreferredWidth(colWidth[i]);
}
// double click displays citation info
MouseListener mouseListener = new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
displayCitations();
}
}
};
_table.addMouseListener(mouseListener);
panel.add(new JScrollPane(_table), BorderLayout.CENTER);
try {
refresh();
} catch (DatabaseException e) {
e.printStackTrace();
}
}
/**
* Refresh this pane.
**/
public void refresh() throws DatabaseException {
// set table
Setting setting = _collection.getDatabase().getCurrentSetting();
final View view = _collection.getViewByID(setting.getViewID());
if (view != null) {
List rows = view.getRefineTable();
_tableModel.setRows(rows, view);
_table.setAlignedPositionWidths(rows, new AlignedDataExtractor() {
public String getColumnData(Object obj) {
Object[] objs = (Object[]) obj;
RefineData data = new RefineData(objs, view);
return data.getCorrespondenceSet();
}
});
} else {
// clear table
_tableModel.setRows(Collections.EMPTY_LIST, view);
}
}
/**
* Add buttons
**/
private void addButtons() {
JButton moveCluster =
new AlignedButton(
"btnRefineMoveCluster",
"accRefineMoveCluster",
SwingConstants.CENTER);
moveCluster.setActionCommand("RefineMoveCluster");
moveCluster.addActionListener(_listener);
JButton moveCorrespondenceSet =
new AlignedButton(
"btnRefineMoveCorrespondenceSet",
"accRefineMoveCorrespondenceSet",
SwingConstants.CENTER);
moveCorrespondenceSet.setActionCommand("RefineMoveCorrespondenceSet");
moveCorrespondenceSet.addActionListener(_listener);
JButton moveProtosegment =
new AlignedButton(
"btnRefineMoveProtosegment",
"accRefineMoveProtosegment",
SwingConstants.CENTER);
moveProtosegment.setActionCommand("RefineMoveProtosegment");
moveProtosegment.addActionListener(_listener);
JButton changeEnvironment =
new AlignedButton(
"btnRefineChangeEnvironment",
"accRefineChangeEnvironment",
SwingConstants.CENTER);
changeEnvironment.setActionCommand("RefineChangeEnvironment");
changeEnvironment.addActionListener(_listener);
JButton changeProtosegment =
new AlignedButton(
"btnRefineChangeProtosegment",
"accRefineChangeProtosegment",
SwingConstants.CENTER);
changeProtosegment.setActionCommand("RefineChangeProtosegment");
changeProtosegment.addActionListener(_listener);
JButton mergeClusters =
new AlignedButton(
"btnRefineMergeClusters",
"accRefineMergeClusters",
SwingConstants.CENTER);
mergeClusters.setActionCommand("RefineMergeClusters");
mergeClusters.addActionListener(_listener);
JButton mergeProtosegments =
new AlignedButton(
"btnRefineMergeProtosegments",
"accRefineMergeProtosegments",
SwingConstants.CENTER);
mergeProtosegments.setActionCommand("RefineMergeProtosegments");
mergeProtosegments.addActionListener(_listener);
JButton reorderClusters =
new AlignedButton(
"btnRefineReorderClusters",
"accRefineReorderClusters",
SwingConstants.CENTER);
reorderClusters.setActionCommand("RefineReorderClusters");
reorderClusters.addActionListener(_listener);
JButton retabulateGroup =
new AlignedButton(
"btnRefineRetabulateGroup",
"accRefineRetabulateGroup",
SwingConstants.CENTER);
retabulateGroup.setActionCommand("RefineRetabulateGroup");
retabulateGroup.addActionListener(_listener);
JButton addProtosegment =
new WButton(new WordCorrAction(
"btnRefineAddProtosegment",
"accRefineAddProtosegment") {
public void actionPerformed(ActionEvent evt) {
addProtosegment();
}
});
JButton deleteProtosegment =
new WButton(new WordCorrAction(
"btnRefineDeleteProtosegment",
"accRefineDeleteProtosegment") {
public void actionPerformed(ActionEvent evt) {
deleteProtosegment();
}
});
JButton displayCitations =
new WButton(new WordCorrAction(
"btnRefineDisplayCitations",
"accRefineDisplayCitations") {
public void actionPerformed(ActionEvent evt) {
displayCitations();
}
});
JButton editRemarks =
new WButton(new WordCorrAction("btnEditRemarks", "accEditRemarks") {
public void actionPerformed(ActionEvent evt) {
editRemarks();
}
});
JButton summarize =
new WButton(new WordCorrAction("btnRefineSummarize", "accRefineSummarize") {
public void actionPerformed(ActionEvent evt) {
summarize();
}
});
JButton results =
new WButton(new WordCorrAction("btnRefineResults", "accRefineResults") {
public void actionPerformed(ActionEvent evt) {
outputResults(evt);
}
});
addButton(addProtosegment);
addButton(deleteProtosegment);
addButton(moveProtosegment);
addButton(mergeProtosegments);
addButton(changeProtosegment);
addSeparator();
addButton(moveCluster);
addButton(mergeClusters);
addButton(reorderClusters);
addButton(changeEnvironment);
addSeparator();
addButton(moveCorrespondenceSet);
addButton(retabulateGroup);
addSeparator();
addButton(editRemarks);
addSeparator();
addButton(displayCitations);
addButton(summarize);
addButton(results);
}
/**
* Action Listener for the buttons.
**/
private class ButtonListener implements ActionListener {
/**
* Action Listener method.
**/
public void actionPerformed(ActionEvent evt) {
Messages messages = AppPrefs.getInstance().getMessages();
Dialogs.showWaitCursor(RefinePane.this);
int[] selectedRows = _table.getSelectedRows();
if (selectedRows.length == 0)
Dialogs.msgbox(messages.getString("msgRefineSelectRow"));
for (int i = 0; i < selectedRows.length; i++) {
RefineData data =
(RefineData) ((RefineTableModel) _table.getModel()).getRow(selectedRows[i]);
if (data == null)
continue;
String cmd = ((JButton) evt.getSource()).getActionCommand();
data.setTask(cmd);
TaskDialog dialog = new TaskDialog("lbl" + cmd, data, cmd);
dialog.setVisible(true);
if (!dialog.isCancelled()) {
if (data.getRefresh()) {
try {
refresh();
} catch (DatabaseException e) {
e.printStackTrace();
}
}
}
if (!data.runMultiple())
break;
}
Dialogs.showDefaultCursor(RefinePane.this);
}
}
/**
* Table cell renderer class.
* Background color based on cluster order.
**/
private static final class RefineCellRenderer
extends JLabel
implements TableCellRenderer {
public RefineCellRenderer() {
super();
init();
}
private void init() {
// necessary for background color change
setOpaque(true);
// setup colors
int ncolors =
Integer.parseInt(AppProperties.getProperty("RefinePaneRowColors"));
_colors = new Color[ncolors];
for (int i = 0; i < ncolors; i++) {
_colors[i] = Color.decode(AppProperties.getProperty("RefinePaneRowColor" + i));
}
_selectColor =
Color.decode(AppProperties.getProperty("RefinePaneRowColorSelect"));
_repeatColorCount = _colors.length - 1;
}
public RefineCellRenderer(Font font) {
super();
init();
setFont(font);
}
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
// get RefineData from table
RefineData data =
(RefineData) table.getModel().getValueAt(row, RefineData.GET_DATA);
// set background color based on cluster order
// first color constant, others repeat
int colori = 0;
if (data.getClusterOrder().intValue() > 1) {
colori = (data.getClusterOrder().intValue() - 1) % _repeatColorCount;
if (colori == 0)
colori = _repeatColorCount;
}
setBackground((isSelected) ? _selectColor : _colors[colori]);
setText((String) value);
return this;
}
private int _repeatColorCount;
private Color[] _colors;
private Color _selectColor;
}
/**
* Table cell renderer class for Aligned characters.
* Background color based on cluster order.
**/
private static final class RefineCellAlignedRenderer
extends AlignedTableCellRenderer {
public RefineCellAlignedRenderer() {
super();
// setup colors
int ncolors =
Integer.parseInt(AppProperties.getProperty("RefinePaneRowColors"));
_colors = new Color[ncolors];
for (int i = 0; i < ncolors; i++) {
_colors[i] = Color.decode(AppProperties.getProperty("RefinePaneRowColor" + i));
}
_selectColor =
Color.decode(AppProperties.getProperty("RefinePaneRowColorSelect"));
_repeatColorCount = _colors.length - 1;
}
public Component getTableCellRendererComponent(
JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
super.getTableCellRendererComponent(
table,
value,
isSelected,
hasFocus,
row,
column);
// get RefineData from table
RefineData data =
(RefineData) table.getModel().getValueAt(row, RefineData.GET_DATA);
// set background color based on cluster order
// first color constant, others repeat
int colori = 0;
if (data.getClusterOrder().intValue() > 1) {
colori = (data.getClusterOrder().intValue() - 1) % _repeatColorCount;
if (colori == 0)
colori = _repeatColorCount;
}
setBackground((isSelected) ? _selectColor : _colors[colori]);
return this;
}
private int _repeatColorCount;
private Color[] _colors;
private Color _selectColor;
}
/**
* Table model class for data elements.
**/
private static final class RefineTableModel extends AbstractTableModel {
public Object getValueAt(int row, int col) {
RefineData data = (RefineData) _rows.get(row);
switch (col) {
case 0 :
return data.getZone();
case 1 :
return data.getProtosegment();
case 2 :
return data.getEnvironment();
case 3 :
return data.getClusterOrder().toString();
case 4 :
return data.getCorrespondenceSet();
case 5 :
return data.getCitationCount() + "";
case 6 :
return data.getCitation();
case 7 :
String hasRemarks = "";
hasRemarks += (data.hasProtosegmentRemarks()) ? "P" : "";
hasRemarks += (data.hasClusterRemarks()) ? "C" : "";
hasRemarks += (data.hasCorrespondenceSetRemarks()) ? "S" : "";
return hasRemarks;
case RefineData.GET_DATA :
return data;
default :
return "";
}
}
public int getColumnCount() {
return 8;
}
public String getColumnName(int i) {
return AppPrefs.getInstance().getMessages().getString(COL_KEYS[i]);
}
public RefineData getRow(int index) {
return (index < 0 || index >= _rows.size())
? null
: (RefineData) _rows.get(index);
}
public int getRowCount() {
return _rows.size();
}
void setRows(List rows, View view) {
_rows = new ArrayList();
RefineData previous = null;
for (Iterator it = rows.iterator(); it.hasNext();) {
Object[] objs = (Object[]) it.next();
RefineData data = new RefineData(objs, view);
if (previous != null) {
if (data.getSet().equals(previous.getSet())) {
previous.add(data.getCitation(), data.getKeys());
} else {
_rows.add(data);
previous = data;
}
} else {
_rows.add(data);
previous = data;
}
}
refresh();
}
public void refresh() {
fireTableStructureChanged();
}
private List _rows = Collections.EMPTY_LIST;
}
/**
* Refine data class.
**/
public static class RefineData implements Task {
public RefineData() {}
public RefineData(int type, View view) {
// type used for custom row display for dialog boxes
_type = type;
_view = view;
}
public RefineData(Object[] data, View view) {
_zone = (String) data[0];
_protosegment = (String) data[1];
_environment = (String) data[2];
_clusterOrder = (Integer) data[3];
_correspondenceSet = (String) data[4];
_citation = (String) data[5];
_hasProtosegmentRemarks = !((data[6] == null) || ((String) data[6]).equals(""));
_hasClusterRemarks = !((data[7] == null) || ((String) data[7]).equals(""));
_hasCorrespondenceSetRemarks =
!((data[8] == null) || ((String) data[8]).equals(""));
addKeys((String) data[9]);
_view = view;
}
public int getType() {
return _type;
}
public String getCitation() {
return _citation;
}
public String getCitation(int idx) {
String val = _citation + ",";
int i1 = 0;
int i2 = -1;
for (int i = 0; i <= idx; i++) {
i1 = i2 + 1;
i2 = val.indexOf(",", i1);
}
return val.substring(i1, i2).trim();
}
public int getCitationCount() {
return _keys.size();
}
public long getCitationKey(int idx) {
return getKey(idx, 5);
}
public long getClusterKey() {
return getKey(0, 3);
}
public Integer getClusterOrder() {
return _clusterOrder;
}
public String getClusterOrderHierarchy() {
return _protosegment + " | " + _environment + " | " + _clusterOrder;
}
public void setClusterOrder(Integer val) {
_clusterOrder = val;
}
public String getCorrespondenceSet() {
return _correspondenceSet;
}
public String getCorrespondenceSetHierarchy() {
return _protosegment
+ " | "
+ _environment
+ " | "
+ _clusterOrder
+ " | "
+ _correspondenceSet;
}
public long getCorrespondenceSetKey() {
return getKey(0, 4);
}
public String getEnvironment() {
return _environment;
}
public void setEnvironment(String val) {
_environment = val;
}
public long getGroupKey(int idx) {
return getKey(idx, 6);
}
public String getProtosegment() {
return _protosegment;
}
public void setProtosegment(String val) {
_protosegment = val;
}
public String getProtosegmentHierarchy() {
return _zone + " | " + _protosegment;
}
public long getProtosegmentKey() {
return getKey(0, 2);
}
public String getZone() {
return _zone;
}
public void setZone(String val) {
_zone = val;
}
public long getZoneKey() {
return getKey(0, 1);
}
public boolean hasClusterRemarks() {
return _hasClusterRemarks;
}
public boolean hasCorrespondenceSetRemarks() {
return _hasCorrespondenceSetRemarks;
}
public boolean hasProtosegmentRemarks() {
return _hasProtosegmentRemarks;
}
public String getRemarks(String type) {
return (String) _remarks.get(type);
}
public void setRemarks(String type, String val) {
_remarks.put(type, (val == null) ? "" : val);
}
public void setRemarksRow(InputRow row) {
_remarksRow = row;
_remarksType = null;
}
public void useRemarksRow(String type) {
if (_remarksType != null)
setRemarks(_remarksType, (String) _remarksRow.getValue());
_remarksType = type;
_remarksRow.setValue(getRemarks(type));
}
private long getKey(int idx, int typeIdx) {
String val = (String) _keys.get(idx) + ":";
int i1 = 0;
int i2 = -1;
for (int i = 0; i < typeIdx; i++) {
i1 = i2 + 1;
i2 = val.indexOf(":", i1);
}
return Long.parseLong(val.substring(i1, i2));
}
public String getKeys() {
return (String) _keys.get(0);
}
public void addKeys(String val) {
_keys.add(val);
}
public String getSet() {
return _zone
+ ":"
+ _protosegment
+ ":"
+ _environment
+ ":"
+ _clusterOrder
+ ":"
+ _correspondenceSet;
}
public void add(String citation, String keys) {
_citation += ", " + citation;
addKeys(keys);
}
public void setTask(String task) {
_task = task;
}
public Object getValue() {
return _value;
}
public void setValue(Object value) {
_value = value;
}
public Object getValue2() {
return _value2;
}
public void setValue2(Object val) {
_value2 = val;
}
public void setRefresh(boolean v) {
// data changed if true, refresh refine list
_refresh = v;
}
public boolean getRefresh() {
return _refresh;
}
public String toString() {
switch (_type) {
case MERGE_PROTOSEGMENTS :
case MOVE_CLUSTER :
case MOVE_CORRESPONDENCE_SET :
//return getProtoSegmentHierarchy();
return "<html>"+_zone+"<font face=\""+FontCache.getIPA().getFontName()+"\"> | "+_protosegment+"</font></html>";
case MERGE_CLUSTERS :
case MOVE_CORRESPONDENCE_SET_TO_CLUSTER :
//return getClusterOrderHierarchy();
return "<html><font face=\""+FontCache.getIPA().getFontName()+"\">"+_protosegment + " | " + _environment + " | </font>" + _clusterOrder;
case MOVE_PROTOSEGMENT :
return getZone();
}
return "";
}
/**
* Run task.
* Return true to close dialog, false to keep open.
**/
public boolean run() {
// check to see if value has been set
if (_value == null)
return true;
// run task
if (_task.equals("RefineChangeEnvironment")) {
return changeEnvironment(this, (String) _value);
} else if (_task.equals("RefineChangeProtosegment")) {
return changeProtosegment(this, (String) _value);
} else if (_task.equals("RefineMergeClusters")) {
return mergeClusters(this, (RefineData) _value);
} else if (_task.equals("RefineMergeProtosegments")) {
return mergeProtosegments(this, (RefineData) _value);
} else if (_task.equals("RefineMoveCluster")) {
return moveCluster(this, (RefineData) _value);
} else if (_task.equals("RefineMoveCorrespondenceSet")) {
return moveCorrespondenceSet(this, (RefineData) _value);
} else if (_task.equals("RefineMoveProtosegment")) {
return moveProtosegment(this, (RefineData) _value);
} else if (_task.equals("RefineReorderClusters")) {
return reorderClusters(this, (List) _value);
} else if (_task.equals("RefineRetabulateGroup")) {
return retabulateGroup(this, (String) _value);
}
return true;
}
/**
* Indicates whether multiple tasks can be run when multiple rows selected.
**/
public boolean runMultiple() {
return (_task.equals("RefineMoveCorrespondenceSet"));
}
public Cluster toCluster() throws DatabaseException {
Protosegment protosegment = toProtosegment();
return protosegment.getCluster(getClusterKey());
}
public CorrespondenceSet toCorrespondenceSet() throws DatabaseException {
Cluster cluster = toCluster();
return cluster.getCorrespondenceSet(getCorrespondenceSetKey());
}
public Protosegment toProtosegment() throws DatabaseException {
return _view.getProtosegment(getProtosegmentKey());
}
public Zone toZone() throws DatabaseException {
Zone zone = (Zone) _view.getDatabase().makeObject(Zone.class);
zone.setID(getZoneKey());
zone.revert();
return zone;
}
private int _type;
private ArrayList _keys = new ArrayList();
private Map _remarks = new HashMap();
private InputRow _remarksRow;
private String _remarksType;
private Integer _clusterOrder;
private String _citation;
private String _correspondenceSet;
private String _environment;
private String _protosegment;
private String _zone;
private boolean _hasClusterRemarks;
private boolean _hasCorrespondenceSetRemarks;
private boolean _hasProtosegmentRemarks;
private String _message;
private String _task;
private Object _value;
private Object _value2;
private View _view;
private boolean _refresh = false;
public static final int MERGE_CLUSTERS = 2;
public static final int MERGE_PROTOSEGMENTS = 3;
public static final int MOVE_CLUSTER = 4;
public static final int MOVE_CORRESPONDENCE_SET = 5;
public static final int MOVE_CORRESPONDENCE_SET_TO_CLUSTER = 6;
public static final int MOVE_PROTOSEGMENT = 7;
public static final int GET_DATA = 1000;
}
/**
* Add new Protosegment.
* Creation of matching protosegment is prevented through validation.
**/
private void addProtosegment() {
try {
Dialogs.showWaitCursor(RefinePane.this);
Database db = _collection.getDatabase();
View view = _collection.getViewByID(db.getCurrentSetting().getViewID());
Zone zone = (Zone) db.makeObject(Zone.class);
Protosegment proto = view.makeProtosegment(zone);
AddDialog dialog = new AddDialog("pgtAddProtosegment", proto, null, true);
dialog.setVisible(true);
if (!dialog.isCancelled()) {}
Dialogs.showDefaultCursor(RefinePane.this);
} catch (DatabaseException e) {
e.getRootCause().printStackTrace();
return;
}
}
/**
* Delete unused Protosegment.
**/
private void deleteProtosegment() {
Messages messages = AppPrefs.getInstance().getMessages();
Dialogs.showWaitCursor(RefinePane.this);
TaskDialog dialog =
new TaskDialog("lblRefineDeleteProtosegment", new RefineData() {
public void setValue(Object obj) {
_proto = (Protosegment) obj;
}
public boolean run() {
try {
_proto.delete();
} catch (DatabaseException e) {
e.printStackTrace();
return true;
}
return true;
}
private Protosegment _proto;
}, "RefineDeleteProtosegment");
dialog.setVisible(true);
if (!dialog.isCancelled()) {}
Dialogs.showDefaultCursor(RefinePane.this);
}
/**
* Display Citations.
**/
private void displayCitations() {
Messages messages = AppPrefs.getInstance().getMessages();
int[] selectedRows = _table.getSelectedRows();
if (selectedRows.length == 0)
Dialogs.msgbox(messages.getString("msgRefineSelectRow"));
for (int i = 0; i < selectedRows.length; i++) {
RefineData data =
(RefineData) ((RefineTableModel) _table.getModel()).getRow(selectedRows[i]);
if (data == null)
continue;
// break up citations into lines
int len = 50;
String citation = data.getCitation();
if (citation.length() <= len) {
Dialogs.customMsgbox(
citation,
messages.getString("pgtRefineDisplayCitations")
+ ": "
+ data.getCorrespondenceSetHierarchy());
} else {
StringBuffer lines = new StringBuffer();
while (citation.length() > len) {
int end = citation.lastIndexOf(",", len);
if (end != -1) {
lines.append(citation.substring(0, end) + "\n");
citation = citation.substring(end + 2);
}
}
lines.append(citation);
Dialogs.customMsgbox(
lines.toString(),
messages.getString("pgtRefineDisplayCitations")
+ ": "
+ data.getCorrespondenceSetHierarchy());
}
}
}
/**
* Edit Remarks.
**/
private void editRemarks() {
Messages messages = AppPrefs.getInstance().getMessages();
int[] selectedRows = _table.getSelectedRows();
if (selectedRows.length == 0)
Dialogs.msgbox(messages.getString("msgRefineSelectRow"));
for (int i = 0; i < selectedRows.length; i++) {
RefineData data =
(RefineData) ((RefineTableModel) _table.getModel()).getRow(selectedRows[i]);
if (data == null)
continue;
// display dialogs
String cmd = "RefineEditRemarks";
data.setTask(cmd);
TaskDialog dialog = new TaskDialog("lbl" + cmd, data, cmd);
data.setRemarksRow(dialog.getRow("value"));
dialog.setVisible(true);
if (!dialog.isCancelled()) {
try {
// ensure last input is captured
data.useRemarksRow("Protosegment");
CorrespondenceSet cset = data.toCorrespondenceSet();
cset.setRemarks(data.getRemarks("Correspondence Set"));
cset.save();
Cluster cluster = cset.getCluster();
cluster.setRemarks(data.getRemarks("Cluster"));
cluster.save();
Protosegment protosegment = data.toProtosegment();
protosegment.setRemarks(data.getRemarks("Protosegment"));
protosegment.save();
// refresh
refresh();
} catch (DatabaseException e) {
e.printStackTrace();
}
}
}
}
private void outputResults(ActionEvent evt) {
MainFrame mf = MainFrame.getInstance();
final User user = mf.getDatabasePane().getCurrentUser();
final WordCollection collection = mf.getDatabasePane().getCurrentCollection();
if (user == null || collection == null)
return;
final JFileChooser fc =
new JFileChooser(
AppPrefs.getInstance().getProperty(
AppPrefs.LAST_DIR,
System.getProperty("user.home")));
int ret = fc.showSaveDialog(mf);
if (ret == JFileChooser.APPROVE_OPTION) {
Runnable task = new Runnable() {
public void run() {
InfinitePipeInputStream db_source = new InfinitePipeInputStream();
InfinitePipeOutputStream db_out = new InfinitePipeOutputStream(db_source);
String filename = fc.getSelectedFile().getAbsolutePath();
filename = (filename.indexOf(".") > 0) ? filename : filename + ".html";
XMLFile file = new XMLFile();
file.setToExport(db_out);
List viewList;
try {
viewList = collection.getViews();
collection.setElementViews(viewList);
file.setUser(user);
file.setCollection(collection);
file.setFilename(filename);
AppPrefs.getInstance().setProperty(AppPrefs.LAST_DIR, file.getFilename());
file.run(); //deadlock
try {
db_out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
InfinitePipeInputStream collectedXML_source = new InfinitePipeInputStream();
InfinitePipeOutputStream collectedXML_out = new InfinitePipeOutputStream(collectedXML_source);
//now we have the basic xml file.
//transform with Results2XML.xsl
transform("/Results2XML.xsl", db_source, collectedXML_out);
//option to export results as xml (for further processing) or html by using TaskDialog?
//if to html:
//transform with ResultsXML2HTML.xsl
OutputStream file_out = new BufferedOutputStream(new FileOutputStream(filename));
transform("/ResultsXML2HTML.xsl", collectedXML_source, file_out);
// update collection export timestamp status -- I don't think we want to update status.
// MainFrame.getInstance().updateStatus();
} catch (DatabaseException ex) {
System.err.println("locus1");
ex.printStackTrace();
} catch (FileNotFoundException ex) {
System.err.println("locus2");
ex.printStackTrace();
}
}
};
Messages m = AppPrefs.getInstance().getMessages();
Dialogs.indeterminateProgressDialog(task, m.getString("pgbWaitString"), m.getString("pgbCurrentTask")+m.getString("btnRefineResults"));
}
}
private void transform(String xsltFilename, InputStream input, OutputStream output) {
try {
StreamSource xsltSource = new StreamSource(getClass().getResourceAsStream(xsltFilename));
Transformer t = TransformerFactory.newInstance().newTransformer(xsltSource);
StreamSource xmlSource = new StreamSource(input);
StreamResult htmlSink = new StreamResult(output);
t.transform(xmlSource, htmlSink);
output.close();
} catch (TransformerConfigurationException e) {
Dialogs.msgbox(AppPrefs.getInstance().getMessages().getString("msgErrSummaryFileCreation"));
e.printStackTrace();
} catch (TransformerException e) {
Dialogs.msgbox(AppPrefs.getInstance().getMessages().getString("msgErrSummaryFileCreation"));
e.printStackTrace();
} catch (FileNotFoundException e) {
Dialogs.msgbox(AppPrefs.getInstance().getMessages().getString("msgErrSummaryFileCreation"));
e.printStackTrace();
} catch (IOException e) {
Dialogs.msgbox(AppPrefs.getInstance().getMessages().getString("msgErrSummaryFileCreation"));
e.printStackTrace();
}
}
/**
* Summarize Evidence.
**/
private void summarize() {
Dialogs.showWaitCursor(RefinePane.this);
try {
Database db = _collection.getDatabase();
View view = _collection.getViewByID(db.getCurrentSetting().getViewID());
// display dialog
String cmd = "RefineSummarize";
SummaryFile data = new SummaryFile();
data.setView(view);
TaskDialog dialog = new TaskDialog("lbl" + cmd, data, cmd);
dialog.setVisible(true);
if (!dialog.isCancelled()) {
if (data.getTabulatedGroupCount() < 50) {
Messages messages = AppPrefs.getInstance().getMessages();
Dialogs.msgbox(
messages.getCompoundMessage(
"msgRefineSummarizeWarning",
data.getTabulatedGroupCount() + ""));
}
}
} catch (DatabaseException e) {
e.getRootCause().printStackTrace();
return;
}
Dialogs.showDefaultCursor(RefinePane.this);
}
/**
* Change Cluster environment.
**/
public static final boolean changeEnvironment(
RefineData fromData,
String value) {
/*
System.out.println("*** fromData="+ fromData.getSet()+" ZoneKey="+fromData.getZoneKey()
+ " ProtoKey="+fromData.getProtosegmentKey()
+ " clusterKey="+fromData.getClusterKey()
+ " corrSetKey="+fromData.getCorrespondenceSetKey()
+ " citationKey="+fromData.getCitationKey(0));
System.out.println("*** toData="+ toData.getSet()+" ZoneKey="+toData.getZoneKey()
+ " ProtoKey="+toData.getProtosegmentKey()
+ " clusterKey="+toData.getClusterKey());
*/
try {
Cluster fromCluster = fromData.toCluster();
fromCluster.setEnvironment(value);
fromCluster.save();
fromCluster.getProtosegment().reorderClusterOrder();
} catch (DatabaseException e) {
e.printStackTrace();
return true;
}
fromData.setRefresh(true);
return true;
}
/**
* Change Protosegment value.
* Prompt user if matching protosegment exists.
**/
public static final boolean changeProtosegment(
RefineData fromData,
String value) {
try {
Protosegment fromProtosegment = fromData.toProtosegment();
fromProtosegment.setProtosegment(value);
String msg = fromProtosegment.checkValidation();
if (msg == null) {
fromProtosegment.save();
fromData.setRefresh(true);
return true;
} else {
Dialogs.msgbox(msg);
fromData.setRefresh(false);
return false;
}
} catch (DatabaseException e) {
e.printStackTrace();
return true;
}
}
/**
* Merge 2 Clusters by moving conformable correspondence sets.
* Uncomformable sets remain with originating cluster.
* Originating cluster is deleted if all correspondence sets are moved.
**/
public static final boolean mergeClusters(
RefineData fromData,
RefineData toData) {
try {
Cluster fromCluster = fromData.toCluster();
Cluster toCluster = toData.toCluster();
// check to cluster correspondence sets
List toSets = toCluster.getCorrespondenceSets();
if (toSets.isEmpty()) {
// delete bad cluster
toCluster.delete();
Dialogs.msgbox(
AppPrefs.getInstance().getMessages().getString("msgRefineEmptyToCluster"));
fromData.setRefresh(false);
return true;
}
// move all correspondence sets from cluster
boolean moveSuccess = false;
boolean moveFailure = false;
List fromSets = fromCluster.getCorrespondenceSets();
for (Iterator it = fromSets.iterator(); it.hasNext();) {
CorrespondenceSet fromSet = (CorrespondenceSet) it.next();
// move correspondence set if identical or comformable
if (toCluster.addCorrespondenceSet(fromSet)) {
// success
moveSuccess = true;
} else {
// failure
moveFailure = true;
}
}
// moved all
if (!moveFailure) {
// delete from cluster after appending remarks
toCluster.appendRemarks(fromCluster.getRemarks());
toCluster.save();
Protosegment fromProtosegment = fromCluster.getProtosegment();
fromCluster.delete();
fromProtosegment.reorderClusterOrder();
}
// nothing moved
if (!moveSuccess)
Dialogs.msgbox(
AppPrefs.getInstance().getMessages().getString(
"msgRefineMergeClustersNoChange"));
// refresh if moved at least one
fromData.setRefresh(moveSuccess);
} catch (DatabaseException e) {
e.printStackTrace();
Dialogs.error(AppPrefs.getInstance().getMessages().getString("msgErrDatabase"));
fromData.setRefresh(false);
return true;
}
return true;
}
/**
* Merge 2 Protosegments by moving all clusters to target protosegment.
* Clusters are not merged because multiple clusters with same environments possible.
**/
public static final boolean mergeProtosegments(
RefineData fromData,
RefineData toData) {
try {
Protosegment fromProtosegment = fromData.toProtosegment();
Protosegment toProtosegment = toData.toProtosegment();
// move all clusters from protosegment
// refresh if moved at least one
fromData.setRefresh(
toProtosegment.moveClustersFromProtosegment(fromProtosegment));
} catch (DatabaseException e) {
e.printStackTrace();
Dialogs.error(AppPrefs.getInstance().getMessages().getString("msgErrDatabase"));
fromData.setRefresh(false);
return true;
}
return true;
}
/**
* Move Cluster to another protosegment.
* Clusters are not merged because multiple clusters with same environments possible.
**/
public static final boolean moveCluster(
RefineData fromData,
RefineData toData) {
try {
Cluster fromCluster = fromData.toCluster();
Protosegment fromProtosegment = fromData.toProtosegment();
Protosegment toProtosegment = toData.toProtosegment();
// move cluster
fromCluster.setProtosegment(toProtosegment);
fromCluster.setOrder(new Integer(toProtosegment.getMaxClusterOrder() + 1));
fromCluster.save();
fromProtosegment.reorderClusterOrder();
toProtosegment.reorderClusterOrder();
} catch (DatabaseException e) {
e.printStackTrace();
Dialogs.error(AppPrefs.getInstance().getMessages().getString("msgErrDatabase"));
fromData.setRefresh(false);
return true;
}
fromData.setRefresh(true);
return true;
}
/**
* Move Correspondence Set to another cluster by specifying protosegment and environment.
* Conformable and identical set moved.
* Multiple clusters with conformable sets causes prompt to select specific one.
* Protosegments with unmatched clusters (environment) creates new cluster.
**/
public static final boolean moveCorrespondenceSet(
RefineData fromData,
RefineData toData) {
try {
CorrespondenceSet fromSet = fromData.toCorrespondenceSet();
Cluster fromCluster = fromSet.getCluster();
final Protosegment toProtosegment = toData.toProtosegment();
final String environment = ((String) fromData.getValue2());
// get list of clusters with conformable sets
WordCollection collection =
MainFrame.getInstance().getDatabasePane().getCurrentCollection();
Setting setting = collection.getDatabase().getCurrentSetting();
final View view = collection.getViewByID(setting.getViewID());
List clusters =
collection.getDatabase().retrieveObjects(new RetrieveAllParameters() {
public String getRetrieveAllSQLKey() {
return "GET_REFINE_MOVE_CORRESPONDENCE_SET_TO_CLUSTER_ROW";
}
public void setRetrieveAllParameters(PreparedStatement stmt)
throws SQLException {
stmt.setLong(1, toProtosegment.getID());
stmt.setString(2, environment);
}
public Object createObject(Database db, ResultSet rs) throws SQLException {
RefineData data =
new RefineData(RefineData.MOVE_CORRESPONDENCE_SET_TO_CLUSTER, view);
data.setProtosegment(rs.getString(1));
data.setEnvironment(rs.getString(2));
data.setClusterOrder(new Integer(rs.getInt(3)));
data.addKeys(rs.getString(4));
return data;
}
});
// remove non-conformable clusters and identical cluster
boolean identicalCluster = false;
for (int i = 0; i < clusters.size(); i++) {
RefineData clusterData = (RefineData) clusters.get(i);
Cluster cluster = clusterData.toCluster();
if (cluster.getID() == fromCluster.getID())
identicalCluster = true;
if (identicalCluster
|| !cluster.hasConformable(fromSet)) {
clusters.remove(i);
i--;
}
}
boolean moveToNewCluster = false;
if (clusters.size() == 0) {
// check for removal of identical cluster
if (identicalCluster)
return true;
// create and move to new cluster
moveToNewCluster = true;
} else if (clusters.size() == 1) {
// move to cluster
RefineData clusterData = (RefineData) clusters.get(0);
Cluster toCluster = clusterData.toCluster();
// move correspondence set
if (!toCluster.addCorrespondenceSet(fromSet))
// uncomformable create and move to new cluster
moveToNewCluster = true;
} else {
// query user for cluster to move to
// cluster selection list is stored in value
fromData.setValue(clusters);
String cmd = "RefineMoveCorrespondenceSetToCluster";
fromData.setTask(cmd);
TaskDialog dialog = new TaskDialog("lbl" + cmd, fromData, cmd);
dialog.setVisible(true);
if (!dialog.isCancelled()) {
// move to cluster
RefineData clusterData = (RefineData) fromData.getValue();
Cluster toCluster = clusterData.toCluster();
// move correspondence set
if (!toCluster.addCorrespondenceSet(fromSet))
// uncomformable create and move to new cluster
moveToNewCluster = true;
} else {
// cancelled
fromData.setRefresh(false);
return true;
}
}
// move to new cluster
if (moveToNewCluster)
moveCorrespondenceSetToNewCluster(
fromSet,
fromCluster,
toProtosegment,
environment);
} catch (DatabaseException e) {
e.printStackTrace();
Dialogs.error(AppPrefs.getInstance().getMessages().getString("msgErrDatabase"));
fromData.setRefresh(false);
return true;
}
fromData.setRefresh(true);
return true;
}
/**
* Move Correspondence Set to new Cluster.
**/
private static final void moveCorrespondenceSetToNewCluster(
CorrespondenceSet fromSet,
Cluster fromCluster,
Protosegment toProtosegment,
String environment)
throws DatabaseException {
// create new cluster
Cluster newCluster = toProtosegment.makeCluster();
newCluster.setEnvironment(environment);
newCluster.setOrder(new Integer(toProtosegment.getMaxClusterOrder() + 1));
newCluster.save();
// move protosegment
fromSet.setCluster(newCluster);
fromSet.setOrder(new Integer(1));
fromSet.save();
if (fromCluster.getCorrespondenceSets().isEmpty()) {
// delete empty cluster after adding remarks to new cluster
newCluster.setRemarks(fromCluster.getRemarks());
newCluster.save();
Protosegment fromProtosegment = fromCluster.getProtosegment();
fromCluster.delete();
fromProtosegment.reorderClusterOrder();
}
toProtosegment.reorderClusterOrder();
}
/**
* Move Protosegment to another zone.
* Only zones without matching protosegments are selectable.
**/
public static final boolean moveProtosegment(
RefineData fromData,
RefineData toData) {
try {
Protosegment fromProtosegment = fromData.toProtosegment();
Zone toZone = toData.toZone();
fromProtosegment.setZone(toZone);
fromProtosegment.save();
} catch (DatabaseException e) {
e.printStackTrace();
return true;
}
fromData.setRefresh(true);
return true;
}
/**
* Reorder clusters of Protosegment by changing ClusterOrder.
**/
public static final boolean reorderClusters(
RefineData fromData,
List clusters) {
try {
int order = 0;
for (Iterator it = clusters.iterator(); it.hasNext();) {
Cluster cluster = (Cluster) it.next();
cluster.setOrder(new Integer(++order));
cluster.save();
}
} catch (DatabaseException e) {
e.printStackTrace();
Dialogs.error(AppPrefs.getInstance().getMessages().getString("msgErrDatabase"));
fromData.setRefresh(true);
return true;
}
fromData.setRefresh(true);
return true;
}
/**
* Retabulate Group.
**/
public static final boolean retabulateGroup(
RefineData fromData,
String citation) {
// get group key
long key = -1;
for (int i = 0; i < fromData.getCitationCount(); i++) {
if (fromData.getCitation(i).equals(citation)) {
key = fromData.getGroupKey(i);
break;
}
}
// get group and retabulate
String tag = "";
try {
WordCollection collection =
MainFrame.getInstance().getDatabasePane().getCurrentCollection();
Setting setting = collection.getDatabase().getCurrentSetting();
View view = collection.getViewByID(setting.getViewID());
Group group = new Group(collection.getDatabase(), key, view, null);
group.revert();
tag = group.getName();
group.retabulate();
// refresh list
fromData.setRefresh(true);
} catch (DatabaseException e) {
e.printStackTrace();
Dialogs.error(AppPrefs.getInstance().getMessages().getString("msgErrDatabase"));
fromData.setRefresh(false);
return true;
}
// display confirmation message
String[] messageData = { citation.substring(0, citation.indexOf(tag)), tag };
Dialogs.msgbox(
AppPrefs.getInstance().getMessages().getCompoundMessage(
"msgRefineRetabulateGroup",
messageData));
return true;
}
/**
* Base Input Row for refine data.
**/
protected static class RefineInputRow extends InputRow {
/**
* Constructor.
**/
public RefineInputRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj);
_data = (RefineData) obj;
_refresh = refresh;
init(_combo, _combo);
refresh();
}
/**
* Refresh this object.
**/
public void refresh() {}
/**
* Set the value of this row.
**/
public void setValue(Object value) {
refresh();
_combo.setSelectedItem(value);
}
/**
* Get the value of this row.
**/
public Object getValue() {
return _combo.getSelectedItem();
}
protected final JComboBox _combo = new JComboBox(new BasicListModel() {
public void setSelectedItem(Object o) {
super.setSelectedItem(o);
_data.setValue(o);
try {
_refresh.refresh();
} catch (DatabaseException ignored) {}
}
});
protected final Refreshable _refresh;
protected final RefineData _data;
}
/**
* Input Row for delete protosegment data.
**/
public static final class RefineDeleteProtosegmentRow extends RefineInputRow {
/**
* Constructor.
**/
public RefineDeleteProtosegmentRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Refresh this object.
**/
public void refresh() {
// set table
try {
WordCollection collection =
MainFrame.getInstance().getDatabasePane().getCurrentCollection();
Setting setting = collection.getDatabase().getCurrentSetting();
View view = collection.getViewByID(setting.getViewID());
List protosegments = view.getUnusedProtosegments();
// display zone with protosegment in selection list
for (Iterator it = protosegments.iterator(); it.hasNext();) {
Protosegment protosegment = (Protosegment) it.next();
protosegment.setDisplayZone(true);
protosegment.setHTMLtoString(true);
}
((BasicListModel) _combo.getModel()).setData(protosegments);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
}
/**
* Input Row for edit remarks data.
**/
public static final class RefineEditRemarksRow extends RefineInputRow {
/**
* Constructor.
**/
public RefineEditRemarksRow(
BeanCatalog.Property prop,
final Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
_combo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
String type = (String) _combo.getSelectedItem();
if (type != null) {
((RefineData) obj).useRemarksRow(type);
}
}
});
}
/**
* Refresh this object.
**/
public void refresh() {
// set table
try {
List types = new ArrayList();
String type = "Correspondence Set";
types.add(type);
CorrespondenceSet cset = _data.toCorrespondenceSet();
_data.setRemarks(type, cset.getRemarks());
type = "Cluster";
types.add(type);
Cluster cluster = cset.getCluster();
_data.setRemarks(type, cluster.getRemarks());
type = "Protosegment";
types.add(type);
Protosegment protosegment = _data.toProtosegment();
_data.setRemarks(type, protosegment.getRemarks());
((BasicListModel) _combo.getModel()).setData(types);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
}
/**
* Input Row for merge clusters data.
**/
public static final class RefineMergeClustersRow extends RefineInputRow {
/**
* Constructor.
**/
public RefineMergeClustersRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Refresh this object.
**/
public void refresh() {
// set table
try {
WordCollection collection =
MainFrame.getInstance().getDatabasePane().getCurrentCollection();
Setting setting = collection.getDatabase().getCurrentSetting();
final View view = collection.getViewByID(setting.getViewID());
List list =
collection.getDatabase().retrieveObjects(new RetrieveAllParameters() {
public String getRetrieveAllSQLKey() {
return "GET_REFINE_MERGE_CLUSTERS_ROW";
}
public void setRetrieveAllParameters(PreparedStatement stmt)
throws SQLException {
stmt.setLong(1, view.getID());
stmt.setLong(2, _data.getProtosegmentKey());
stmt.setString(3, _data.getEnvironment());
stmt.setLong(4, _data.getClusterKey());
}
public Object createObject(Database db, ResultSet rs) throws SQLException {
RefineData data = new RefineData(RefineData.MERGE_CLUSTERS, view);
data.setProtosegment(rs.getString(1));
data.setEnvironment(rs.getString(2));
data.setClusterOrder(new Integer(rs.getInt(3)));
data.addKeys(rs.getString(4));
return data;
}
});
((BasicListModel) _combo.getModel()).setData(list);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
}
/**
* Input Row for merge protosegments data.
**/
public static final class RefineMergeProtosegmentsRow extends RefineInputRow {
/**
* Constructor.
**/
public RefineMergeProtosegmentsRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Refresh this object.
**/
public void refresh() {
// set table
try {
WordCollection collection =
MainFrame.getInstance().getDatabasePane().getCurrentCollection();
Setting setting = collection.getDatabase().getCurrentSetting();
final View view = collection.getViewByID(setting.getViewID());
List list =
collection.getDatabase().retrieveObjects(new RetrieveAllParameters() {
public String getRetrieveAllSQLKey() {
return "GET_REFINE_MERGE_PROTOSEGMENTS_ROW";
}
public void setRetrieveAllParameters(PreparedStatement stmt)
throws SQLException {
stmt.setLong(1, view.getID());
stmt.setLong(2, _data.getProtosegmentKey());
}
public Object createObject(Database db, ResultSet rs) throws SQLException {
RefineData data = new RefineData(RefineData.MERGE_PROTOSEGMENTS, view);
data.setZone(rs.getString(1));
data.setProtosegment(rs.getString(2));
data.addKeys(rs.getString(3));
return data;
}
});
((BasicListModel) _combo.getModel()).setData(list);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
}
/**
* Input Row for move cluster to another protosegment data.
**/
public static final class RefineMoveClusterRow extends RefineInputRow {
/**
* Constructor.
**/
public RefineMoveClusterRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Refresh this object.
**/
public void refresh() {
// set table
try {
WordCollection collection =
MainFrame.getInstance().getDatabasePane().getCurrentCollection();
Setting setting = collection.getDatabase().getCurrentSetting();
final View view = collection.getViewByID(setting.getViewID());
List list =
collection.getDatabase().retrieveObjects(new RetrieveAllParameters() {
public String getRetrieveAllSQLKey() {
return "GET_REFINE_MOVE_CLUSTER_ROW";
}
public void setRetrieveAllParameters(PreparedStatement stmt)
throws SQLException {
stmt.setLong(1, view.getID());
stmt.setLong(2, _data.getProtosegmentKey());
}
public Object createObject(Database db, ResultSet rs) throws SQLException {
RefineData data = new RefineData(RefineData.MOVE_CLUSTER, view);
data.setZone(rs.getString(1));
data.setProtosegment(rs.getString(2));
data.addKeys(rs.getString(3));
return data;
}
});
((BasicListModel) _combo.getModel()).setData(list);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
}
/**
* Input Row for move correspondence set to another protosegment data.
* Default environment field is also initialized with current value.
**/
public static final class RefineMoveCorrespondenceSetRow
extends RefineInputRow {
/**
* Constructor.
**/
public RefineMoveCorrespondenceSetRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Refresh this object.
**/
public void refresh() {
// set table
try {
WordCollection collection =
MainFrame.getInstance().getDatabasePane().getCurrentCollection();
Setting setting = collection.getDatabase().getCurrentSetting();
final View view = collection.getViewByID(setting.getViewID());
List list =
collection.getDatabase().retrieveObjects(new RetrieveAllParameters() {
public String getRetrieveAllSQLKey() {
return "GET_REFINE_MOVE_CORRESPONDENCE_SET_ROW";
}
public void setRetrieveAllParameters(PreparedStatement stmt)
throws SQLException {
stmt.setLong(1, view.getID());
}
public Object createObject(Database db, ResultSet rs) throws SQLException {
RefineData data = new RefineData(RefineData.MOVE_CORRESPONDENCE_SET, view);
data.setZone(rs.getString(1));
data.setProtosegment(rs.getString(2));
data.addKeys(rs.getString(3));
return data;
}
});
((BasicListModel) _combo.getModel()).setData(list);
} catch (Exception e) {
Dialogs.genericError(e);
}
// set environment (set value2 workaround)
_data.setValue2(_data.getEnvironment());
}
}
/**
* Input Row for move correspondence set to another cluster data.
**/
public static final class RefineMoveCorrespondenceSetToClusterRow
extends RefineInputRow {
/**
* Constructor.
**/
public RefineMoveCorrespondenceSetToClusterRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Refresh this object.
**/
public void refresh() {
((BasicListModel) _combo.getModel()).setData((List) _data.getValue());
}
}
public static final class RefineMoveProtosegmentRow extends RefineInputRow {
/**
* Constructor.
**/
public RefineMoveProtosegmentRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Refresh this object.
**/
public void refresh() {
// set table
try {
WordCollection collection =
MainFrame.getInstance().getDatabasePane().getCurrentCollection();
Setting setting = collection.getDatabase().getCurrentSetting();
final View view = collection.getViewByID(setting.getViewID());
List list =
collection.getDatabase().retrieveObjects(new RetrieveAllParameters() {
public String getRetrieveAllSQLKey() {
return "GET_REFINE_MOVE_PROTOSEGMENT_ROW";
}
public void setRetrieveAllParameters(PreparedStatement stmt)
throws SQLException {
stmt.setLong(1, view.getID());
stmt.setString(2, _data.getProtosegment());
}
public Object createObject(Database db, ResultSet rs) throws SQLException {
RefineData data = new RefineData(RefineData.MOVE_PROTOSEGMENT, view);
data.setZone(rs.getString(3));
data.addKeys(rs.getString(4));
return data;
}
});
((BasicListModel) _combo.getModel()).setData(list);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
}
/**
* Input Row for move protosegment to another zone data.
* Zones with no matching protosegments displayed in list.
**/
protected static class RefineReorderClustersRow extends InputRow {
/**
* Constructor.
**/
public RefineReorderClustersRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj);
_data = (RefineData) obj;
_refresh = refresh;
// create sorter
init(_sorter, _sorter);
refresh();
// set RefineData object with each change
_sorter.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent evt) {
_data.setValue(_sorter.getList());
try {
_refresh.refresh();
} catch (DatabaseException e) {
Dialogs.genericError(e);
}
}
});
}
/**
* Refresh this object.
**/
public void refresh() {
// set table
try {
List clusters = _data.toProtosegment().getClusters();
_sorter.reset(clusters);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
/**
* Set the value of this row.
**/
public void setValue(Object value) {
refresh();
}
/**
* Get the value of this row.
**/
public Object getValue() {
return _sorter.getList();
}
protected final MultiSorter _sorter = new MultiSorter();
protected final Refreshable _refresh;
protected final RefineData _data;
}
/**
* Input Row for retabulate group.
* Citations displayed in list.
**/
public static final class RefineRetabulateGroupRow extends RefineInputRow {
/**
* Constructor.
**/
public RefineRetabulateGroupRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Refresh this object.
**/
public void refresh() {
// set table
try {
ArrayList list = new ArrayList();
for (int i = 0; i < _data.getCitationCount(); i++) {
list.add(_data.getCitation(i));
}
((BasicListModel) _combo.getModel()).setData(list);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
}
/**
* Base Summarize Input Row.
**/
protected static class RefineSummarizeInputRow extends InputRow {
/**
* Constructor.
**/
public RefineSummarizeInputRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj);
_data = (SummaryFile) obj;
_refresh = refresh;
init(_combo, _combo);
refresh();
}
/**
* Refresh this object.
**/
public void refresh() {}
/**
* Set the value of this row.
**/
public void setValue(Object value) {
refresh();
_combo.setSelectedItem(value);
}
/**
* Get the value of this row.
**/
public Object getValue() {
return _combo.getSelectedItem();
}
/**
* Set selection data.
**/
public void setSelectionData(Object v) {}
protected final JComboBox _combo = new JComboBox(new BasicListModel() {
public void setSelectedItem(Object o) {
super.setSelectedItem(o);
setSelectionData(o);
try {
_refresh.refresh();
} catch (DatabaseException ignored) {}
}
});
protected final Refreshable _refresh;
protected final SummaryFile _data;
}
/**
* Input Row for summarize display frantz for clusters/protosegments data.
**/
public static final class RefineSummarizeDisplayFrantzRow
extends RefineSummarizeInputRow {
/**
* Constructor.
**/
public RefineSummarizeDisplayFrantzRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Set selection data.
**/ //davisnw -- modified to use AppPrefs for localization.
public void setSelectionData(Object v) {
Messages messages = AppPrefs.getInstance().getMessages();
String frantzChoice = (String) v;
if (v.equals(messages.getString("cmbRefineSummarizeFrantzClusters"))) {
_data.setDisplayFrantz("Clusters");
} else if (v.equals(messages.getString("cmbRefineSummarizeFrantzProtosegments"))) {
_data.setDisplayFrantz("Protosegments");
} else {
_data.setDisplayFrantz("Both");
}
}
/**
* Refresh this object.
**/ //davisnw -- modified to use AppPrefs for localization.
public void refresh() {
Messages messages = AppPrefs.getInstance().getMessages();
// set table
try {
List list = new ArrayList();
list.add(messages.getString("cmbRefineSummarizeFrantzClusters"));
list.add(messages.getString("cmbRefineSummarizeFrantzProtosegments"));
list.add(messages.getString("cmbRefineSummarizeFrantzBoth"));
((BasicListModel) _combo.getModel()).setData(list);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
}
/**
* Input Row for summarize gloss data.
**/
public static final class RefineSummarizeGlossRow
extends RefineSummarizeInputRow {
/**
* Constructor.
**/
public RefineSummarizeGlossRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Set selection data.
**/ //davisnw -- modified to use AppPrefs for localization.
public void setSelectionData(Object v) {
String gloss = (String) v;
if (v.equals(AppPrefs.getInstance().getMessages().getString("cmbRefineSummarizeGlossPrimary"))) {
_data.setGloss("Primary");
}
else {
_data.setGloss("Secondary");
}
}
/**
* Refresh this object.
**/ //davisnw -- modified to use AppPrefs for localization.
public void refresh() {
Messages messages=AppPrefs.getInstance().getMessages();
// set table
try {
List list = new ArrayList();
list.add(messages.getString("cmbRefineSummarizeGlossPrimary"));
boolean noSecondaryGloss =
_data.getView().getCollection().getGloss2().equals("");
if (!noSecondaryGloss)
list.add(messages.getString("cmbRefineSummarizeGlossSecondary"));
((BasicListModel) _combo.getModel()).setData(list);
if (noSecondaryGloss)
_combo.setSelectedIndex(0);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
}
/**
* Input Row for output format
**/ //davisnw -added.
public static final class RefineSummarizeFormatRow
extends RefineSummarizeInputRow {
/**
* Constructor.
**/
public RefineSummarizeFormatRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Set selection data.
**/
public void setSelectionData(Object v) {
Messages messages = AppPrefs.getInstance().getMessages();
if (v.equals(messages.getString("cmbRefineSummarizeMODE_XML"))) {
_data.setOutputXSL(null);
} else {
StringTokenizer t = new StringTokenizer(AppProperties.getProperty("RefineSummarizeXSLs"),",");
while (t.hasMoreElements()) {
String xsl=t.nextToken();
if (v.equals(messages.getString("cmb" + xsl))) {
_data.setOutputXSL(AppProperties.getProperty(xsl,null));
_data.setOutputExtension(AppProperties.getProperty(xsl+"_extension",""));
return;
}
}
Dialogs.error(messages.getString("msgErrSummaryFileFormat")+v.toString());
}
}
/**
* Refresh this object.
**/
public void refresh() {
Messages messages = AppPrefs.getInstance().getMessages();
// set table
try {
List list = new ArrayList();
list.add(messages.getString("cmbRefineSummarizeMODE_XML"));
StringTokenizer t = new StringTokenizer(AppProperties.getProperty("RefineSummarizeXSLs"),",");
while (t.hasMoreElements()) {
list.add(messages.getString("cmb" + t.nextToken()));
}
((BasicListModel) _combo.getModel()).setData(list);
_combo.setSelectedIndex(0);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
}
/**
* Input Row for summarize include residue data.
**/
public static final class RefineSummarizeIncludeResidueRow
extends RefineSummarizeInputRow {
/**
* Constructor.
**/
public RefineSummarizeIncludeResidueRow(
BeanCatalog.Property prop,
Object obj,
Refreshable refresh) {
super(prop, obj, refresh);
}
/**
* Set selection data.
**/
public void setSelectionData(Object v) {
_data.setIncludeResidue(((String) v).equals(AppPrefs.getInstance().getMessages().getString("cmbYes")));
}
/**
* Refresh this object.
**/
public void refresh() {
Messages messages = AppPrefs.getInstance().getMessages();
// set table
try {
List list = new ArrayList();
list.add(messages.getString("cmbYes"));
list.add(messages.getString("cmbNo"));
((BasicListModel) _combo.getModel()).setData(list);
} catch (Exception e) {
Dialogs.genericError(e);
}
}
}
private AlignedTable _table;
private RefineTableModel _tableModel;
private final ButtonListener _listener = new ButtonListener();
private final WordCollection _collection;
}