package com.compomics.util.gui;
import com.compomics.util.Util;
import com.compomics.util.experiment.biology.AminoAcid;
import com.compomics.util.experiment.biology.AminoAcidPattern;
import com.compomics.util.preferences.SequenceMatchingPreferences;
import java.awt.Color;
import no.uib.jsparklines.extra.NimbusCheckBoxRenderer;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import java.awt.Toolkit;
/**
* This dialog allows the design and test of amino acid patterns. (see class
* com.compomics.util.experiment.biology.AminoAcidPattern)
*
* @author Marc Vaudel
* @author Harald Barsnes
*/
public class AminoAcidPatternDialog extends javax.swing.JDialog {
/**
* The pattern displayed.
*/
private AminoAcidPattern pattern;
/**
* A boolean indicating whether the pattern can be edited.
*/
private boolean editable;
/**
* A boolean indicating whether the used clicked the cancel button.
*/
private boolean cancel = false;
/**
* The pattern design table column header tooltips.
*/
private ArrayList<String> patternDesignTableToolTips;
/**
* The example sequence.
*/
private final String exampleSequence = "MKFILLWALLNLTVALAFNPDYTVSSTPPYLVYLKSDYLPCAGVLIHPLWVITAAHCNLPKLRVILGVTIPADSNEKHLQVIGYE"
+ "KMIHHPHFSVTSIDHDIMLIKLKTEAELNDYVKLANLPYQTISENTMCSVSTWSYNVCDIYKEPDSLQTVNISVISKPQCRDAYKTYNITENMLCVGIVPGRRQPC"
+ "KEVSAAPAICNGMLQGILSFADGCVLRADVGIYAKIFYYIPWIENVIQNN"; // @TODO: perhaps this should be saved somewhere and reused if the user changes the sequence?
/**
* Creates a new AminoAcidPatternDialog.
*
* @param parent the parent frame
* @param pattern the amino acid pattern object
* @param editable if the pattern is editable or not
*/
public AminoAcidPatternDialog(java.awt.Frame parent, AminoAcidPattern pattern, boolean editable) {
super(parent, true);
if (pattern == null) {
this.pattern = new AminoAcidPattern();
} else {
this.pattern = new AminoAcidPattern(pattern);
}
this.editable = editable;
initComponents();
setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/icons/compomics-utilities.png")));
setUpGui();
setLocationRelativeTo(parent);
setVisible(true);
}
/**
* Set up the GUI.
*/
private void setUpGui() {
patternDesignScrollPane.getViewport().setOpaque(false);
patternDesignTable.getTableHeader().setReorderingAllowed(false);
// correct the color for the upper right corner
JPanel proteinCorner = new JPanel();
proteinCorner.setBackground(patternDesignTable.getTableHeader().getBackground());
patternDesignScrollPane.setCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER, proteinCorner);
if (!editable) {
cancelButton.setEnabled(false);
}
patternDesignTableToolTips = new ArrayList<String>();
patternDesignTableToolTips.add(null);
patternDesignTableToolTips.add("Reference Index");
patternDesignTableToolTips.add("The targeted amino acids");
patternDesignTableToolTips.add("The excluded amino acids");
// the index column
patternDesignTable.getColumn(" ").setMaxWidth(50);
patternDesignTable.getColumn(" ").setMinWidth(50);
patternDesignTable.getColumn("Ref").setMaxWidth(30);
patternDesignTable.getColumn("Ref").setMinWidth(30);
patternDesignTable.getColumn("Ref").setCellRenderer(new NimbusCheckBoxRenderer());
patternTestEditorPane.setText(exampleSequence);
displayPattern();
repaintTable();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
popupJMenu = new javax.swing.JPopupMenu();
addJMenuItem = new javax.swing.JMenuItem();
jSeparator3 = new javax.swing.JSeparator();
moveUpJMenuItem = new javax.swing.JMenuItem();
moveDownJMenuItem = new javax.swing.JMenuItem();
jSeparator4 = new javax.swing.JSeparator();
deleteSelectedRowJMenuItem = new javax.swing.JMenuItem();
backgroundPanel = new javax.swing.JPanel();
patternDesignPanel = new javax.swing.JPanel();
patternDesignScrollPane = new javax.swing.JScrollPane();
patternDesignTable = new JTable() {
protected JTableHeader createDefaultTableHeader() {
return new JTableHeader(columnModel) {
public String getToolTipText(MouseEvent e) {
java.awt.Point p = e.getPoint();
int index = columnModel.getColumnIndexAtX(p.x);
int realIndex = columnModel.getColumn(index).getModelIndex();
return (String) patternDesignTableToolTips.get(realIndex);
}
};
}
};
rightClickHelpLabel = new javax.swing.JLabel();
testPanel = new javax.swing.JPanel();
patternTestJScrollPane = new javax.swing.JScrollPane();
patternTestEditorPane = new javax.swing.JEditorPane();
cancelButton = new javax.swing.JButton();
okButton = new javax.swing.JButton();
exampleLabel = new javax.swing.JLabel();
addJMenuItem.setMnemonic('A');
addJMenuItem.setText("Add");
addJMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addJMenuItemActionPerformed(evt);
}
});
popupJMenu.add(addJMenuItem);
popupJMenu.add(jSeparator3);
moveUpJMenuItem.setMnemonic('U');
moveUpJMenuItem.setText("Move Up");
moveUpJMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
moveUpJMenuItemActionPerformed(evt);
}
});
popupJMenu.add(moveUpJMenuItem);
moveDownJMenuItem.setMnemonic('D');
moveDownJMenuItem.setText("Move Down");
moveDownJMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
moveDownJMenuItemActionPerformed(evt);
}
});
popupJMenu.add(moveDownJMenuItem);
popupJMenu.add(jSeparator4);
deleteSelectedRowJMenuItem.setText("Delete");
deleteSelectedRowJMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
deleteSelectedRowJMenuItemActionPerformed(evt);
}
});
popupJMenu.add(deleteSelectedRowJMenuItem);
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Modification Pattern");
backgroundPanel.setBackground(new java.awt.Color(230, 230, 230));
patternDesignPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Pattern Design"));
patternDesignPanel.setOpaque(false);
patternDesignScrollPane.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
patternDesignScrollPaneMouseClicked(evt);
}
});
patternDesignTable.setModel(new PatternTable());
patternDesignTable.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
patternDesignTableMouseClicked(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
patternDesignTableMouseReleased(evt);
}
});
patternDesignTable.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
patternDesignTableKeyReleased(evt);
}
});
patternDesignScrollPane.setViewportView(patternDesignTable);
rightClickHelpLabel.setFont(rightClickHelpLabel.getFont().deriveFont((rightClickHelpLabel.getFont().getStyle() | java.awt.Font.ITALIC)));
rightClickHelpLabel.setText("Right click in the table for options.");
javax.swing.GroupLayout patternDesignPanelLayout = new javax.swing.GroupLayout(patternDesignPanel);
patternDesignPanel.setLayout(patternDesignPanelLayout);
patternDesignPanelLayout.setHorizontalGroup(
patternDesignPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(patternDesignPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(patternDesignPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(patternDesignScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 402, Short.MAX_VALUE)
.addGroup(patternDesignPanelLayout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(rightClickHelpLabel)
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
patternDesignPanelLayout.setVerticalGroup(
patternDesignPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(patternDesignPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(patternDesignScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 108, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(rightClickHelpLabel))
);
testPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Pattern Test"));
testPanel.setOpaque(false);
patternTestEditorPane.setContentType("text/html");
patternTestEditorPane.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
patternTestEditorPaneKeyReleased(evt);
}
});
patternTestJScrollPane.setViewportView(patternTestEditorPane);
javax.swing.GroupLayout testPanelLayout = new javax.swing.GroupLayout(testPanel);
testPanel.setLayout(testPanelLayout);
testPanelLayout.setHorizontalGroup(
testPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, testPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(patternTestJScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
.addContainerGap())
);
testPanelLayout.setVerticalGroup(
testPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(testPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(patternTestJScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE)
.addContainerGap())
);
cancelButton.setText("Cancel");
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
okButton.setText("OK");
okButton.setPreferredSize(new java.awt.Dimension(65, 23));
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
exampleLabel.setText("<html><i>\n<a href>Show Example</a></i>\n</html>");
exampleLabel.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
exampleLabelMouseClicked(evt);
}
public void mouseEntered(java.awt.event.MouseEvent evt) {
exampleLabelMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
exampleLabelMouseExited(evt);
}
});
javax.swing.GroupLayout backgroundPanelLayout = new javax.swing.GroupLayout(backgroundPanel);
backgroundPanel.setLayout(backgroundPanelLayout);
backgroundPanelLayout.setHorizontalGroup(
backgroundPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(backgroundPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(backgroundPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(testPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(patternDesignPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, backgroundPanelLayout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(exampleLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cancelButton)))
.addContainerGap())
);
backgroundPanelLayout.setVerticalGroup(
backgroundPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(backgroundPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(patternDesignPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(testPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(backgroundPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(cancelButton, javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, backgroundPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(exampleLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
backgroundPanelLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {cancelButton, okButton});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(backgroundPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(backgroundPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
pack();
}// </editor-fold>//GEN-END:initComponents
/**
* Validate the input and close the dialog.
*
* @param evt
*/
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
boolean valid = validateInput();
if (valid) {
dispose();
}
}//GEN-LAST:event_okButtonActionPerformed
/**
* Close the dialog without saving.
*
* @param evt
*/
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
cancel = true;
dispose();
}//GEN-LAST:event_cancelButtonActionPerformed
/**
* Change the cursor into a hand cursor.
*
* @param evt
*/
private void exampleLabelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exampleLabelMouseEntered
setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
}//GEN-LAST:event_exampleLabelMouseEntered
/**
* Change the cursor back to the default cursor.
*
* @param evt
*/
private void exampleLabelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exampleLabelMouseExited
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_exampleLabelMouseExited
/**
* Open an example pattern.
*
* @param evt
*/
private void exampleLabelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exampleLabelMouseClicked
pattern = AminoAcidPattern.getTrypsinExample();
patternTestEditorPane.setText(exampleSequence);
displayPattern();
repaintTable();
}//GEN-LAST:event_exampleLabelMouseClicked
/**
* Move the selected row one row up.
*
* @param evt
*/
private void moveUpJMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_moveUpJMenuItemActionPerformed
int selectedRow = patternDesignTable.getSelectedRow();
int selectedColumn = patternDesignTable.getSelectedColumn();
pattern.swapRows(selectedRow, selectedRow - 1);
patternDesignTable.changeSelection(selectedRow - 1, selectedColumn, false, false);
}//GEN-LAST:event_moveUpJMenuItemActionPerformed
/**
* Move the selected row one row down.
*
* @param evt
*/
private void moveDownJMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_moveDownJMenuItemActionPerformed
int selectedRow = patternDesignTable.getSelectedRow();
int selectedColumn = patternDesignTable.getSelectedColumn();
pattern.swapRows(selectedRow, selectedRow + 1);
patternDesignTable.changeSelection(selectedRow + 1, selectedColumn, false, false);
}//GEN-LAST:event_moveDownJMenuItemActionPerformed
/**
* Deletes the selected row.
*
* @param evt
*/
private void deleteSelectedRowJMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteSelectedRowJMenuItemActionPerformed
int selectedRow = patternDesignTable.getSelectedRow();
if (selectedRow != -1) {
pattern.removeAA(selectedRow);
repaintTable();
displayPattern();
validateInput();
}
}//GEN-LAST:event_deleteSelectedRowJMenuItemActionPerformed
/**
* Adds a new row to the list.
*
* @param evt
*/
private void addJMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addJMenuItemActionPerformed
pattern.setTargeted(patternDesignTable.getRowCount(), new ArrayList<Character>(1));
repaintTable();
}//GEN-LAST:event_addJMenuItemActionPerformed
/**
* Test the pattern.
*
* @param evt
*/
private void patternDesignTableKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_patternDesignTableKeyReleased
displayPattern();
}//GEN-LAST:event_patternDesignTableKeyReleased
/**
* Test the pattern.
*
* @param evt
*/
private void patternDesignTableMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_patternDesignTableMouseReleased
displayPattern();
}//GEN-LAST:event_patternDesignTableMouseReleased
/**
* Show the pop up menu.
*
* @param evt
*/
private void patternDesignTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_patternDesignTableMouseClicked
if (evt.getButton() == 3) {
int selectedRow = patternDesignTable.rowAtPoint(evt.getPoint());
int column = patternDesignTable.columnAtPoint(evt.getPoint());
patternDesignTable.changeSelection(selectedRow, column, false, false);
moveUpJMenuItem.setEnabled(false);
moveDownJMenuItem.setEnabled(false);
deleteSelectedRowJMenuItem.setEnabled(true);
if (selectedRow > 0) {
moveUpJMenuItem.setEnabled(true);
}
if (selectedRow < patternDesignTable.getRowCount() - 1) {
moveDownJMenuItem.setEnabled(true);
}
popupJMenu.show(evt.getComponent(), evt.getX(), evt.getY());
}
}//GEN-LAST:event_patternDesignTableMouseClicked
/**
* Show the pop up menu.
*
* @param evt
*/
private void patternDesignScrollPaneMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_patternDesignScrollPaneMouseClicked
if (evt.getButton() == 3) {
if (patternDesignTable.getSelectedRow() == -1) {
moveUpJMenuItem.setEnabled(false);
moveDownJMenuItem.setEnabled(false);
deleteSelectedRowJMenuItem.setEnabled(false);
}
popupJMenu.show(evt.getComponent(), evt.getX(), evt.getY());
}
}//GEN-LAST:event_patternDesignScrollPaneMouseClicked
/**
* Test the pattern.
*
* @param evt
*/
private void patternTestEditorPaneKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_patternTestEditorPaneKeyReleased
displayPattern();
}//GEN-LAST:event_patternTestEditorPaneKeyReleased
/**
* Returns the pattern as edited by the user.
*
* @return the pattern as edited by the user
*/
public AminoAcidPattern getPattern() {
return pattern;
}
/**
* indicates whether the changes have been canceled
*
* @return a boolean indicating whether the changes have been canceled
*/
public boolean isCanceled() {
return cancel;
}
/**
* Returns the given list of amino acids as a comma separated String.
*
* @param targetedAminoAcids the given list of targeted amino acids
*
* @return the given list of amino acids as a comma separated String
*/
private String getTargetedAAasString(ArrayList<Character> targetedAminoAcids) {
String result = "";
if (targetedAminoAcids != null) {
if (targetedAminoAcids.isEmpty()) {
for (char aa : AminoAcid.getUniqueAminoAcids()) {
if (!result.equals("")) {
result += ",";
}
result += aa;
}
}
for (Character aa : targetedAminoAcids) {
if (!result.contains(aa + "")) {
if (!result.equals("")) {
result += ",";
}
result += aa;
}
}
}
return result;
}
/**
* Returns the given list of amino acids as a comma separated String.
*
* @param targetedAminoAcids the given list of targeted amino acids
*
* @return the given list of amino acids as a comma separated String
*/
private String getExcludedAAasString(ArrayList<Character> targetedAminoAcids) {
String result = "";
if (targetedAminoAcids == null || !targetedAminoAcids.isEmpty()) {
for (char aa : AminoAcid.getUniqueAminoAcids()) {
if (targetedAminoAcids == null || !targetedAminoAcids.contains(aa)) {
if (!result.equals("")) {
result += ",";
}
result += aa;
}
}
}
return result;
}
/**
* Returns a list of amino acids from a comma separated String.
*
* @param aminoAcids the comma separated String
* @return the corresponding list of amino acids
*/
private ArrayList<Character> getAAfromString(String aminoAcids) {
ArrayList<Character> result = new ArrayList<Character>();
for (String aa : aminoAcids.split(",")) {
String input = aa.trim();
input = input.toUpperCase();
if (!input.equals("")) {
for (int i = 0; i < input.length(); i++) {
char aaChar = input.charAt(i);
AminoAcid aminoAcid = AminoAcid.getAminoAcid(aaChar);
if (aminoAcid == null) {
throw new IllegalArgumentException("Cannot parse " + aaChar + " into an amino acid");
} else {
result.add(aaChar);
}
}
}
}
return result;
}
/**
* Tests the pattern on the test text and puts highlights the text every
* time the pattern is found.
*/
private void displayPattern() {
String tempSequence = patternTestEditorPane.getText();
int caretPosition = patternTestEditorPane.getCaretPosition();
// remove html tags
if (tempSequence.contains("<html>")) {
tempSequence = tempSequence.replaceAll("\\<[^>]*>", "");
}
ArrayList<Integer> indexes = pattern.getIndexes(tempSequence, SequenceMatchingPreferences.defaultStringMatching);
String result = "";
for (int i = 0; i < tempSequence.length(); i++) {
if (indexes.contains(i + 1)) {
result += "<span style=\"color:#" + Util.color2Hex(Color.WHITE) + ";background:#" + Util.color2Hex(Color.BLUE) + "\">";
} else {
result += "<span style=\"color:#" + Util.color2Hex(Color.BLACK) + ";background:#" + Util.color2Hex(Color.WHITE) + "\">";
}
result += tempSequence.charAt(i);
result += "</span>";
}
patternTestEditorPane.setText(result);
patternTestEditorPane.setCaretPosition(caretPosition);
}
/**
* Table model for the pattern table.
*/
private class PatternTable extends DefaultTableModel {
@Override
public int getRowCount() {
return pattern.length();
}
@Override
public int getColumnCount() {
return 4;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return " ";
case 1:
return "Ref";
case 2:
return "Targeted AA";
case 3:
return "Excluded AA";
default:
return "";
}
}
@Override
public Object getValueAt(int row, int column) {
switch (column) {
case 0:
return row + 1;
case 1:
return row == pattern.getTarget();
case 2:
return getTargetedAAasString(pattern.getTargetedAA(row));
case 3:
return getExcludedAAasString(pattern.getTargetedAA(row));
default:
return "";
}
}
@Override
public void setValueAt(Object aValue, int row, int column) {
try {
if (column == 1) {
pattern.setTarget(row);
} else if (column == 2) {
ArrayList<Character> aa = getAAfromString(aValue.toString());
if (aa.isEmpty()) {
pattern.removeAA(row);
} else {
pattern.setTargeted(row, aa);
}
} else if (column == 3) {
ArrayList<Character> aa = getAAfromString(aValue.toString());
if (aa.isEmpty()) {
pattern.setTargeted(row, aa);
} else {
pattern.setExcluded(row, aa);
}
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage(),
"Input Error", JOptionPane.ERROR_MESSAGE);
}
repaintTable();
}
@Override
public Class getColumnClass(int columnIndex) {
for (int i = 0; i < getRowCount(); i++) {
if (getValueAt(i, columnIndex) != null) {
return getValueAt(i, columnIndex).getClass();
}
}
return (new Double(0.0)).getClass();
}
@Override
public boolean isCellEditable(int row, int column) {
return editable && column != 0;
}
}
/**
* Repaints the table.
*/
private void repaintTable() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
patternDesignTable.revalidate();
patternDesignTable.repaint();
}
});
}
/**
* Validates the input.
*
* @return true if the input is valid.
*/
private boolean validateInput() {
// check for empty target
if (pattern.getAminoAcidsAtTarget().size() < 1) {
JOptionPane.showMessageDialog(this, "There has to be at least one amino acid for the targeted residue!", "Empty Target", JOptionPane.WARNING_MESSAGE);
return false;
}
return true;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenuItem addJMenuItem;
private javax.swing.JPanel backgroundPanel;
private javax.swing.JButton cancelButton;
private javax.swing.JMenuItem deleteSelectedRowJMenuItem;
private javax.swing.JLabel exampleLabel;
private javax.swing.JSeparator jSeparator3;
private javax.swing.JSeparator jSeparator4;
private javax.swing.JMenuItem moveDownJMenuItem;
private javax.swing.JMenuItem moveUpJMenuItem;
private javax.swing.JButton okButton;
private javax.swing.JPanel patternDesignPanel;
private javax.swing.JScrollPane patternDesignScrollPane;
private javax.swing.JTable patternDesignTable;
private javax.swing.JEditorPane patternTestEditorPane;
private javax.swing.JScrollPane patternTestJScrollPane;
private javax.swing.JPopupMenu popupJMenu;
private javax.swing.JLabel rightClickHelpLabel;
private javax.swing.JPanel testPanel;
// End of variables declaration//GEN-END:variables
}