package com.compomics.util.gui.ptm;
import com.compomics.util.Util;
import com.compomics.util.examples.BareBonesBrowserLaunch;
import com.compomics.util.experiment.biology.AminoAcidPattern;
import com.compomics.util.experiment.biology.PTM;
import com.compomics.util.experiment.biology.PTMFactory;
import com.compomics.util.gui.error_handlers.HelpDialog;
import com.compomics.util.pride.CvTerm;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import no.uib.jsparklines.extra.HtmlLinksRenderer;
import no.uib.jsparklines.renderers.JSparklinesBarChartTableCellRenderer;
import no.uib.jsparklines.renderers.JSparklinesIntegerColorTableCellRenderer;
import org.jfree.chart.plot.PlotOrientation;
/**
* A dialog where the modification details can be modified.
*
* @author Harald Barsnes
*/
public class ModificationsDialog extends javax.swing.JDialog {
/**
* The post translational modifications factory.
*/
private PTMFactory ptmFactory = PTMFactory.getInstance();
/**
* The color used for the sparkline bar chart plots.
*/
private Color sparklineColor = new Color(110, 196, 97);
/**
* The color to use for the HTML tags for the selected rows, in HTML color
* code.
*/
private String selectedRowHtmlTagFontColor = "#FFFFFF";
/**
* The color to use for the HTML tags for the rows that are not selected, in
* HTML color code.
*/
private String notSelectedRowHtmlTagFontColor = "#0101DF";
/**
* The default mods table column header tooltips.
*/
private ArrayList<String> defaultModsTableToolTips;
/**
* The user mods table column header tooltips.
*/
private ArrayList<String> userModsTableToolTips;
/**
* The lines of the PTMs concerned by the search.
*/
private ArrayList<Integer> searchPossibilities = new ArrayList<Integer>();
/**
* The search current selection.
*/
private int searchCurrentSelection = 0;
/**
* The search text to display by default.
*/
private final String searchWelcomeText = "(name or mass)";
/**
* Creates a new ModificationsDialog.
*
* @param parentFrame the parent frame
* @param modal if the dialog is to be modal or not
*/
public ModificationsDialog(Frame parentFrame, boolean modal) {
super(parentFrame, modal);
initComponents();
// set up tables
setUpTables();
searchInputTxt.setText(searchWelcomeText);
searchIndexLabel.setText("");
searchPreviousButton.setEnabled(false);
searchNextButton.setEnabled(false);
setLocationRelativeTo(parentFrame);
setVisible(true);
}
/**
* Set up the table properties.
*/
private void setUpTables() {
defaultModificationsTable.setAutoCreateRowSorter(true);
userModificationsTable.setAutoCreateRowSorter(true);
// make sure that the scroll panes are see-through
defaultModsScrollPane.getViewport().setOpaque(false);
userModsScrollPane.getViewport().setOpaque(false);
defaultModificationsTable.getTableHeader().setReorderingAllowed(false);
userModificationsTable.getTableHeader().setReorderingAllowed(false);
// the index column
defaultModificationsTable.getColumn(" ").setMaxWidth(50);
defaultModificationsTable.getColumn(" ").setMinWidth(50);
userModificationsTable.getColumn(" ").setMaxWidth(50);
userModificationsTable.getColumn(" ").setMinWidth(50);
defaultModificationsTable.getColumn("Short").setMaxWidth(100);
defaultModificationsTable.getColumn("Short").setMinWidth(100);
userModificationsTable.getColumn("Short").setMaxWidth(100);
userModificationsTable.getColumn("Short").setMinWidth(100);
defaultModificationsTable.getColumn("Residues").setMaxWidth(100);
defaultModificationsTable.getColumn("Residues").setMinWidth(100);
userModificationsTable.getColumn("Residues").setMaxWidth(100);
userModificationsTable.getColumn("Residues").setMinWidth(100);
defaultModificationsTable.getColumn("Type").setMaxWidth(50);
defaultModificationsTable.getColumn("Type").setMinWidth(50);
userModificationsTable.getColumn("Type").setMaxWidth(50);
userModificationsTable.getColumn("Type").setMinWidth(50);
defaultModificationsTable.getColumn("CV").setMaxWidth(100);
defaultModificationsTable.getColumn("CV").setMinWidth(100);
userModificationsTable.getColumn("CV").setMaxWidth(100);
userModificationsTable.getColumn("CV").setMinWidth(100);
// set up the ptm type color map
HashMap<Integer, Color> ptmTypeColorMap = new HashMap<Integer, Color>();
ptmTypeColorMap.put(PTM.MODMAX, Color.lightGray);
ptmTypeColorMap.put(PTM.MODAA, sparklineColor);
ptmTypeColorMap.put(PTM.MODC, Color.CYAN);
ptmTypeColorMap.put(PTM.MODCAA, Color.MAGENTA);
ptmTypeColorMap.put(PTM.MODCP, Color.RED);
ptmTypeColorMap.put(PTM.MODCPAA, Color.ORANGE);
ptmTypeColorMap.put(PTM.MODN, Color.YELLOW);
ptmTypeColorMap.put(PTM.MODNAA, Color.PINK);
ptmTypeColorMap.put(PTM.MODNP, Color.BLUE);
ptmTypeColorMap.put(PTM.MODNPAA, Color.GRAY);
// set up the ptm type tooltip map
HashMap<Integer, String> ptmTypeTooltipMap = new HashMap<Integer, String>();
ptmTypeTooltipMap.put(PTM.MODMAX, "max number of modification types");
ptmTypeTooltipMap.put(PTM.MODAA, "Particular Amino Acid(s)");
ptmTypeTooltipMap.put(PTM.MODC, "Protein C-term");
ptmTypeTooltipMap.put(PTM.MODCAA, "Protein C-term - Particular Amino Acid(s)");
ptmTypeTooltipMap.put(PTM.MODCP, "Peptide C-term");
ptmTypeTooltipMap.put(PTM.MODCPAA, "Peptide C-term - Particular Amino Acid(s)");
ptmTypeTooltipMap.put(PTM.MODN, "Protein N-term");
ptmTypeTooltipMap.put(PTM.MODNAA, "Protein N-term - Particular Amino Acid(s)");
ptmTypeTooltipMap.put(PTM.MODNP, "Peptide N-term");
ptmTypeTooltipMap.put(PTM.MODNPAA, "Peptide N-term - Particular Amino Acid(s)");
defaultModificationsTable.getColumn("Type").setCellRenderer(new JSparklinesIntegerColorTableCellRenderer(Color.lightGray, ptmTypeColorMap, ptmTypeTooltipMap));
userModificationsTable.getColumn("Type").setCellRenderer(new JSparklinesIntegerColorTableCellRenderer(Color.lightGray, ptmTypeColorMap, ptmTypeTooltipMap));
defaultModificationsTable.getColumn("CV").setCellRenderer(new HtmlLinksRenderer(selectedRowHtmlTagFontColor, notSelectedRowHtmlTagFontColor));
userModificationsTable.getColumn("CV").setCellRenderer(new HtmlLinksRenderer(selectedRowHtmlTagFontColor, notSelectedRowHtmlTagFontColor));
updateMassSparklines();
// set up the table header tooltips
defaultModsTableToolTips = new ArrayList<String>();
defaultModsTableToolTips.add(null);
defaultModsTableToolTips.add("Modification Name");
defaultModsTableToolTips.add("Modification Short Name");
defaultModsTableToolTips.add("Modification Mass Change");
defaultModsTableToolTips.add("Modification Type");
defaultModsTableToolTips.add("Affected Residues");
defaultModsTableToolTips.add("CV Term Mapping");
userModsTableToolTips = new ArrayList<String>();
userModsTableToolTips.add(null);
userModsTableToolTips.add("Modification Name");
userModsTableToolTips.add("Modification Short Name");
userModsTableToolTips.add("Modification Mass Change");
userModsTableToolTips.add("Modification Type");
userModsTableToolTips.add("Affected Residues");
userModsTableToolTips.add("CV Term Mapping");
((TitledBorder) defaultModsPanel.getBorder()).setTitle("Default Modifications (" + defaultModificationsTable.getRowCount() + ")");
((TitledBorder) userModsPanel.getBorder()).setTitle("User Modifications (" + userModificationsTable.getRowCount() + ")");
}
/**
* Update the max value of the mass sparklines.
*/
private void updateMassSparklines() {
// get the max absolute mass change
double maxMassChange = 0;
for (int i = 0; i < defaultModificationsTable.getRowCount(); i++) {
if (Math.abs((Double) defaultModificationsTable.getValueAt(i, defaultModificationsTable.getColumn("Mass").getModelIndex())) > maxMassChange) {
maxMassChange = Math.abs((Double) defaultModificationsTable.getValueAt(i, defaultModificationsTable.getColumn("Mass").getModelIndex()));
}
}
for (int i = 0; i < userModificationsTable.getRowCount(); i++) {
if (Math.abs((Double) userModificationsTable.getValueAt(i, userModificationsTable.getColumn("Mass").getModelIndex())) > maxMassChange) {
maxMassChange = Math.abs((Double) userModificationsTable.getValueAt(i, userModificationsTable.getColumn("Mass").getModelIndex()));
}
}
defaultModificationsTable.getColumn("Mass").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, -maxMassChange, maxMassChange));
((JSparklinesBarChartTableCellRenderer) defaultModificationsTable.getColumn("Mass").getCellRenderer()).showNumberAndChart(true, 57, new DecimalFormat("0.0000"));
userModificationsTable.getColumn("Mass").setCellRenderer(new JSparklinesBarChartTableCellRenderer(PlotOrientation.HORIZONTAL, -maxMassChange, maxMassChange));
((JSparklinesBarChartTableCellRenderer) userModificationsTable.getColumn("Mass").getCellRenderer()).showNumberAndChart(true, 57, new DecimalFormat("0.0000"));
}
/**
* 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() {
defaultPtmPopupMenu = new javax.swing.JPopupMenu();
viewDefaultPtmJMenuItem = new javax.swing.JMenuItem();
userPtmPopupMenu = new javax.swing.JPopupMenu();
editUserPtmJMenuItem = new javax.swing.JMenuItem();
modificationsEditorPanel = new javax.swing.JPanel();
modificationsSplitPane = new javax.swing.JSplitPane();
defaultModsPanel = new javax.swing.JPanel();
defaultModsScrollPane = new javax.swing.JScrollPane();
defaultModificationsTable = 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) defaultModsTableToolTips.get(realIndex);
}
};
}
};
searchIndexLabel = new javax.swing.JLabel();
searchNextButton = new javax.swing.JButton();
searchPreviousButton = new javax.swing.JButton();
searchInputTxt = new javax.swing.JTextField();
findJLabel = new javax.swing.JLabel();
exportDefaultModsLabel = new javax.swing.JLabel();
userModsPanel = new javax.swing.JPanel();
userModsScrollPane = new javax.swing.JScrollPane();
userModificationsTable = 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) userModsTableToolTips.get(realIndex);
}
};
}
};
deleteUserPTM = new javax.swing.JButton();
editUserPTM = new javax.swing.JButton();
addUserPTM = new javax.swing.JButton();
exportUserModsLabel = new javax.swing.JLabel();
okButton = new javax.swing.JButton();
modificationsHelpJButton = new javax.swing.JButton();
viewDefaultPtmJMenuItem.setText("View");
viewDefaultPtmJMenuItem.setToolTipText("View Details");
viewDefaultPtmJMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
viewDefaultPtmJMenuItemActionPerformed(evt);
}
});
defaultPtmPopupMenu.add(viewDefaultPtmJMenuItem);
editUserPtmJMenuItem.setText("Edit");
editUserPtmJMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editUserPtmJMenuItemActionPerformed(evt);
}
});
userPtmPopupMenu.add(editUserPtmJMenuItem);
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
setTitle("Modification Details");
setMinimumSize(new java.awt.Dimension(500, 500));
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
formWindowClosing(evt);
}
});
modificationsEditorPanel.setBackground(new java.awt.Color(230, 230, 230));
modificationsSplitPane.setBorder(null);
modificationsSplitPane.setDividerLocation(380);
modificationsSplitPane.setDividerSize(-1);
modificationsSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
modificationsSplitPane.setResizeWeight(0.65);
defaultModsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Default Modifications"));
defaultModsPanel.setOpaque(false);
defaultModificationsTable.setModel(new DefaultPTMTable());
defaultModificationsTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
defaultModificationsTable.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
defaultModificationsTableMouseMoved(evt);
}
});
defaultModificationsTable.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
defaultModificationsTableMouseClicked(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
defaultModificationsTableMouseExited(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
defaultModificationsTableMouseReleased(evt);
}
});
defaultModsScrollPane.setViewportView(defaultModificationsTable);
searchIndexLabel.setFont(searchIndexLabel.getFont().deriveFont((searchIndexLabel.getFont().getStyle() | java.awt.Font.ITALIC)));
searchIndexLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
searchIndexLabel.setText(" ");
searchNextButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/next_grey.png"))); // NOI18N
searchNextButton.setToolTipText("Next");
searchNextButton.setBorderPainted(false);
searchNextButton.setContentAreaFilled(false);
searchNextButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/next.png"))); // NOI18N
searchNextButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
searchNextButtonMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
searchNextButtonMouseExited(evt);
}
});
searchNextButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
searchNextButtonActionPerformed(evt);
}
});
searchPreviousButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/previous_grey.png"))); // NOI18N
searchPreviousButton.setToolTipText("Previous");
searchPreviousButton.setBorder(null);
searchPreviousButton.setBorderPainted(false);
searchPreviousButton.setContentAreaFilled(false);
searchPreviousButton.setIconTextGap(0);
searchPreviousButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/previous.png"))); // NOI18N
searchPreviousButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
searchPreviousButtonMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
searchPreviousButtonMouseExited(evt);
}
});
searchPreviousButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
searchPreviousButtonActionPerformed(evt);
}
});
searchInputTxt.setForeground(new java.awt.Color(204, 204, 204));
searchInputTxt.setHorizontalAlignment(javax.swing.JTextField.CENTER);
searchInputTxt.setText("(name or mass)");
searchInputTxt.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(204, 204, 204)));
searchInputTxt.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseReleased(java.awt.event.MouseEvent evt) {
searchInputTxtMouseReleased(evt);
}
});
searchInputTxt.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
searchInputTxtKeyReleased(evt);
}
});
findJLabel.setText("Find:");
exportDefaultModsLabel.setText("<html><a href>Export to file</a></html>");
exportDefaultModsLabel.setToolTipText("Export to tab delimited text file");
exportDefaultModsLabel.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
exportDefaultModsLabelMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
exportDefaultModsLabelMouseExited(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
exportDefaultModsLabelMouseReleased(evt);
}
});
javax.swing.GroupLayout defaultModsPanelLayout = new javax.swing.GroupLayout(defaultModsPanel);
defaultModsPanel.setLayout(defaultModsPanelLayout);
defaultModsPanelLayout.setHorizontalGroup(
defaultModsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, defaultModsPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(defaultModsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(defaultModsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 924, Short.MAX_VALUE)
.addGroup(defaultModsPanelLayout.createSequentialGroup()
.addGap(6, 6, 6)
.addComponent(exportDefaultModsLabel, 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(findJLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(searchInputTxt, javax.swing.GroupLayout.PREFERRED_SIZE, 205, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(searchPreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, 0)
.addComponent(searchNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(searchIndexLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
defaultModsPanelLayout.setVerticalGroup(
defaultModsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, defaultModsPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(defaultModsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 308, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(defaultModsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
.addComponent(findJLabel)
.addComponent(searchInputTxt, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(searchIndexLabel)
.addComponent(searchPreviousButton, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(searchNextButton, javax.swing.GroupLayout.PREFERRED_SIZE, 15, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(exportDefaultModsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
modificationsSplitPane.setTopComponent(defaultModsPanel);
userModsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("User Modifications"));
userModsPanel.setOpaque(false);
userModificationsTable.setModel(new UserPTMTable());
userModificationsTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
userModificationsTable.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
userModificationsTableMouseMoved(evt);
}
});
userModificationsTable.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
userModificationsTableMouseClicked(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
userModificationsTableMouseExited(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
userModificationsTableMouseReleased(evt);
}
});
userModsScrollPane.setViewportView(userModificationsTable);
deleteUserPTM.setText("Delete");
deleteUserPTM.setToolTipText("Delete a user defined modification");
deleteUserPTM.setEnabled(false);
deleteUserPTM.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
deleteUserPTMActionPerformed(evt);
}
});
editUserPTM.setText("Edit");
editUserPTM.setToolTipText("Edit a user defined modification");
editUserPTM.setEnabled(false);
editUserPTM.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editUserPTMActionPerformed(evt);
}
});
addUserPTM.setText("Add");
addUserPTM.setToolTipText("Add a new user defined modification");
addUserPTM.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addUserPTMActionPerformed(evt);
}
});
exportUserModsLabel.setText("<html><a href>Export to file</a></html>");
exportUserModsLabel.setToolTipText("Export to tab delimited text file");
exportUserModsLabel.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
exportUserModsLabelMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
exportUserModsLabelMouseExited(evt);
}
public void mouseReleased(java.awt.event.MouseEvent evt) {
exportUserModsLabelMouseReleased(evt);
}
});
javax.swing.GroupLayout userModsPanelLayout = new javax.swing.GroupLayout(userModsPanel);
userModsPanel.setLayout(userModsPanelLayout);
userModsPanelLayout.setHorizontalGroup(
userModsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(userModsPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(userModsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(userModsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 924, Short.MAX_VALUE)
.addGroup(userModsPanelLayout.createSequentialGroup()
.addGap(6, 6, 6)
.addComponent(exportUserModsLabel, 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(addUserPTM, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(editUserPTM, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(deleteUserPTM, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
userModsPanelLayout.setVerticalGroup(
userModsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, userModsPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(userModsScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 169, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(userModsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(deleteUserPTM, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(editUserPTM, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(userModsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(addUserPTM, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(exportUserModsLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
modificationsSplitPane.setRightComponent(userModsPanel);
okButton.setText("OK");
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
modificationsHelpJButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icons/help.GIF"))); // NOI18N
modificationsHelpJButton.setToolTipText("Help");
modificationsHelpJButton.setBorder(null);
modificationsHelpJButton.setBorderPainted(false);
modificationsHelpJButton.setContentAreaFilled(false);
modificationsHelpJButton.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent evt) {
modificationsHelpJButtonMouseEntered(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
modificationsHelpJButtonMouseExited(evt);
}
});
modificationsHelpJButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
modificationsHelpJButtonActionPerformed(evt);
}
});
javax.swing.GroupLayout modificationsEditorPanelLayout = new javax.swing.GroupLayout(modificationsEditorPanel);
modificationsEditorPanel.setLayout(modificationsEditorPanelLayout);
modificationsEditorPanelLayout.setHorizontalGroup(
modificationsEditorPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(modificationsEditorPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(modificationsEditorPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(modificationsSplitPane)
.addGroup(modificationsEditorPanelLayout.createSequentialGroup()
.addGap(10, 10, 10)
.addComponent(modificationsHelpJButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(okButton)))
.addContainerGap())
);
modificationsEditorPanelLayout.setVerticalGroup(
modificationsEditorPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(modificationsEditorPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(modificationsSplitPane)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(modificationsEditorPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(okButton)
.addComponent(modificationsHelpJButton, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 976, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(modificationsEditorPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 673, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(modificationsEditorPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(0, 0, 0)))
);
pack();
}// </editor-fold>//GEN-END:initComponents
/**
* Opens the default modification pop up menu.
*
* @param evt
*/
private void defaultModificationsTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_defaultModificationsTableMouseClicked
if (evt.getButton() == MouseEvent.BUTTON3) {
defaultModificationsTable.setRowSelectionInterval(defaultModificationsTable.rowAtPoint(evt.getPoint()), defaultModificationsTable.rowAtPoint(evt.getPoint()));
defaultPtmPopupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
} else if (evt.getClickCount() == 2 && defaultModificationsTable.getSelectedRow() != -1) {
String ptmName = (String) defaultModificationsTable.getValueAt(defaultModificationsTable.getSelectedRow(), defaultModificationsTable.getColumn("Name").getModelIndex());
PTM ptm = ptmFactory.getPTM(ptmName);
new PtmDialog(this, ptm, false);
}
}//GEN-LAST:event_defaultModificationsTableMouseClicked
/**
* Changes the cursor into hand cursor.
*
* @param evt
*/
private void defaultModificationsTableMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_defaultModificationsTableMouseExited
this.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_defaultModificationsTableMouseExited
/**
* Opens the link in a new browser.
*
* @param evt
*/
private void defaultModificationsTableMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_defaultModificationsTableMouseReleased
int row = defaultModificationsTable.rowAtPoint(evt.getPoint());
int column = defaultModificationsTable.columnAtPoint(evt.getPoint());
if (row != -1) {
if (column == defaultModificationsTable.getColumn("CV").getModelIndex()) {
// open protein link in web browser
if (column == defaultModificationsTable.getColumn("CV").getModelIndex() && evt.getButton() == MouseEvent.BUTTON1
&& defaultModificationsTable.getValueAt(row, column) != null
&& ((String) defaultModificationsTable.getValueAt(row, column)).lastIndexOf("<html>") != -1) {
String link = (String) defaultModificationsTable.getValueAt(row, column);
link = link.substring(link.indexOf("\"") + 1);
link = link.substring(0, link.indexOf("\""));
this.setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));
BareBonesBrowserLaunch.openURL(link);
this.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}
}
}
}//GEN-LAST:event_defaultModificationsTableMouseReleased
/**
* Changes the cursor to a hand cursor if over a link.
*
* @param evt
*/
private void defaultModificationsTableMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_defaultModificationsTableMouseMoved
int row = defaultModificationsTable.rowAtPoint(evt.getPoint());
int column = defaultModificationsTable.columnAtPoint(evt.getPoint());
if (row != -1) {
if (column == defaultModificationsTable.getColumn("CV").getModelIndex() && defaultModificationsTable.getValueAt(row, column) != null) {
String tempValue = (String) defaultModificationsTable.getValueAt(row, column);
if (tempValue.lastIndexOf("<html>") != -1) {
this.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
} else {
this.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}
} else {
this.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}
}
}//GEN-LAST:event_defaultModificationsTableMouseMoved
/**
* Changes the cursor to a hand cursor.
*
* @param evt
*/
private void searchNextButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_searchNextButtonMouseEntered
this.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
}//GEN-LAST:event_searchNextButtonMouseEntered
/**
* Changes the cursor back to the default cursor.
*
* @param evt
*/
private void searchNextButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_searchNextButtonMouseExited
this.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_searchNextButtonMouseExited
/**
* Find the next matching PTM.
*
* @param evt
*/
private void searchNextButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchNextButtonActionPerformed
if (searchCurrentSelection == searchPossibilities.size() - 1) {
searchCurrentSelection = 0;
} else {
searchCurrentSelection++;
}
updatePtmSelection();
}//GEN-LAST:event_searchNextButtonActionPerformed
/**
* Changes the cursor to a hand cursor.
*
* @param evt
*/
private void searchPreviousButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_searchPreviousButtonMouseEntered
this.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
}//GEN-LAST:event_searchPreviousButtonMouseEntered
/**
* Changes the cursor back to the default cursor.
*
* @param evt
*/
private void searchPreviousButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_searchPreviousButtonMouseExited
this.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_searchPreviousButtonMouseExited
/**
* Find the previous matching PTM.
*
* @param evt
*/
private void searchPreviousButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchPreviousButtonActionPerformed
if (searchCurrentSelection == 0) {
searchCurrentSelection = searchPossibilities.size() - 1;
} else {
searchCurrentSelection--;
}
updatePtmSelection();
}//GEN-LAST:event_searchPreviousButtonActionPerformed
/**
* Start the PTM search.
*
* @param evt
*/
private void searchInputTxtMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_searchInputTxtMouseReleased
if (searchInputTxt.getText().equals(searchWelcomeText)) {
searchInputTxt.selectAll();
}
}//GEN-LAST:event_searchInputTxtMouseReleased
/**
* Start the PTM search.
*
* @param evt
*/
private void searchInputTxtKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_searchInputTxtKeyReleased
if (!searchInputTxt.getText().equalsIgnoreCase(searchWelcomeText)) {
searchInputTxt.setForeground(Color.black);
} else {
searchInputTxt.setForeground(new Color(204, 204, 204));
}
if (evt.getKeyCode() == KeyEvent.VK_RIGHT && searchNextButton.isEnabled()) {
searchNextButtonActionPerformed(null);
} else if (evt.getKeyCode() == KeyEvent.VK_LEFT & searchPreviousButton.isEnabled()) {
searchPreviousButtonActionPerformed(null);
} else {
String ptmName, mass;
ArrayList<Integer> toAdd = new ArrayList<Integer>();
searchPossibilities.clear();
searchCurrentSelection = 0;
String input = searchInputTxt.getText().trim().toLowerCase();
if (!input.equals("")) {
for (int row = 0; row < ptmFactory.getDefaultModifications().size(); row++) {
ptmName = ptmFactory.getDefaultModifications().get(row).toLowerCase();
mass = ptmFactory.getPTM(ptmName).getMass() + "";
if (mass.startsWith(input)) {
searchPossibilities.add(row);
} else if (ptmName.contains(input)) {
toAdd.add(row);
}
}
searchPossibilities.addAll(toAdd);
}
}
if (searchPossibilities.size() > 1) {
searchPreviousButton.setEnabled(true);
searchNextButton.setEnabled(true);
searchIndexLabel.setForeground(Color.BLACK);
updatePtmSelection();
} else if (searchPossibilities.size() == 1) {
searchPreviousButton.setEnabled(false);
searchNextButton.setEnabled(false);
searchIndexLabel.setForeground(Color.BLACK);
updatePtmSelection();
} else {
searchPreviousButton.setEnabled(false);
searchNextButton.setEnabled(false);
searchIndexLabel.setForeground(Color.RED);
searchIndexLabel.setText("(no match)");
}
}//GEN-LAST:event_searchInputTxtKeyReleased
/**
* Opens the user mods pop up dialog or the PtmDialog.
*
* @param evt
*/
private void userModificationsTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_userModificationsTableMouseClicked
if (evt.getButton() == MouseEvent.BUTTON3) {
userModificationsTable.setRowSelectionInterval(userModificationsTable.rowAtPoint(evt.getPoint()), userModificationsTable.rowAtPoint(evt.getPoint()));
editUserPTM.setEnabled(true);
deleteUserPTM.setEnabled(true);
userPtmPopupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
} else if (evt.getClickCount() == 2 && userModificationsTable.getSelectedRow() != -1) {
String ptmName = (String) userModificationsTable.getValueAt(userModificationsTable.getSelectedRow(), userModificationsTable.getColumn("Name").getModelIndex());
PTM ptm = ptmFactory.getPTM(ptmName);
PtmDialog ptmDialog = new PtmDialog(this, ptm, true);
if (!ptmDialog.isCanceled()) {
updateModifications();
}
}
}//GEN-LAST:event_userModificationsTableMouseClicked
/**
* Changes the cursor back to the default cursor.
*
* @param evt
*/
private void userModificationsTableMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_userModificationsTableMouseExited
this.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_userModificationsTableMouseExited
/**
* Opens the protein link in the browser.
*
* @param evt
*/
private void userModificationsTableMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_userModificationsTableMouseReleased
editUserPTM.setEnabled(userModificationsTable.getSelectedColumnCount() > 0);
deleteUserPTM.setEnabled(userModificationsTable.getSelectedColumnCount() > 0);
int row = userModificationsTable.rowAtPoint(evt.getPoint());
int column = userModificationsTable.columnAtPoint(evt.getPoint());
if (row != -1) {
if (column == userModificationsTable.getColumn("CV").getModelIndex()) {
// open protein link in web browser
if (column == userModificationsTable.getColumn("CV").getModelIndex() && evt.getButton() == MouseEvent.BUTTON1
&& ((String) userModificationsTable.getValueAt(row, column)).lastIndexOf("<html>") != -1) {
String link = (String) userModificationsTable.getValueAt(row, column);
link = link.substring(link.indexOf("\"") + 1);
link = link.substring(0, link.indexOf("\""));
this.setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));
BareBonesBrowserLaunch.openURL(link);
this.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}
}
}
}//GEN-LAST:event_userModificationsTableMouseReleased
/**
* Change the cursor to a hand cursor when over a link.
*
* @param evt
*/
private void userModificationsTableMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_userModificationsTableMouseMoved
int row = userModificationsTable.rowAtPoint(evt.getPoint());
int column = userModificationsTable.columnAtPoint(evt.getPoint());
if (row != -1) {
if (column == userModificationsTable.getColumn("CV").getModelIndex() && userModificationsTable.getValueAt(row, column) != null) {
String tempValue = (String) userModificationsTable.getValueAt(row, column);
if (tempValue.lastIndexOf("<html>") != -1) {
this.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
} else {
this.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}
} else {
this.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}
}
}//GEN-LAST:event_userModificationsTableMouseMoved
/**
* Delete the given user PTM.
*
* @param evt
*/
private void deleteUserPTMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteUserPTMActionPerformed
int row = userModificationsTable.getSelectedRow();
String ptmName = (String) userModificationsTable.getValueAt(row, userModificationsTable.getColumn("Name").getModelIndex());
int value = JOptionPane.showConfirmDialog(this, "Are you sure that you want to delete \'" + ptmName + "\'?", "Delete Modification?", JOptionPane.YES_NO_OPTION);
if (value == JOptionPane.YES_OPTION) {
ptmFactory.removeUserPtm(ptmName);
updateModifications();
}
}//GEN-LAST:event_deleteUserPTMActionPerformed
/**
* Edit user PTM.
*
* @param evt
*/
private void editUserPTMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editUserPTMActionPerformed
int row = userModificationsTable.getSelectedRow();
String ptmName = (String) userModificationsTable.getValueAt(row, userModificationsTable.getColumn("Name").getModelIndex());
PTM ptm = ptmFactory.getPTM(ptmName);
PtmDialog ptmDialog = new PtmDialog(this, ptm, true);
if (!ptmDialog.isCanceled()) {
updateModifications();
}
}//GEN-LAST:event_editUserPTMActionPerformed
/**
* Add user PTM.
*
* @param evt
*/
private void addUserPTMActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addUserPTMActionPerformed
if (ptmFactory.getUserModifications().size() < 30) {
PtmDialog ptmDialog = new PtmDialog(this, null, true);
if (!ptmDialog.isCanceled()) {
updateModifications();
}
} else {
JOptionPane.showMessageDialog(this, "In order to ensure compatibility with OMSSA, only 30 user modifications can be implemented. Please delete unused modifications.",
"Too many modifications", JOptionPane.WARNING_MESSAGE);
}
}//GEN-LAST:event_addUserPTMActionPerformed
/**
* Change the cursor to a hand cursor.
*
* @param evt
*/
private void modificationsHelpJButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_modificationsHelpJButtonMouseEntered
setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
}//GEN-LAST:event_modificationsHelpJButtonMouseEntered
/**
* Change the cursor back to the default cursor.
*
* @param evt
*/
private void modificationsHelpJButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_modificationsHelpJButtonMouseExited
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_modificationsHelpJButtonMouseExited
/**
* Open the help dialog.
*
* @param evt
*/
private void modificationsHelpJButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_modificationsHelpJButtonActionPerformed
setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));
new HelpDialog(this, getClass().getResource("/helpFiles/ModificationEditor.html"),
Toolkit.getDefaultToolkit().getImage(getClass().getResource("/icons/help.GIF")),
Toolkit.getDefaultToolkit().getImage(getClass().getResource("/icons/help.GIF")),
"Help - Modifications", 500, 10);
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_modificationsHelpJButtonActionPerformed
/**
* Edit a default PTM.
*
* @param evt
*/
private void viewDefaultPtmJMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_viewDefaultPtmJMenuItemActionPerformed
String ptmName = (String) defaultModificationsTable.getValueAt(defaultModificationsTable.getSelectedRow(), defaultModificationsTable.getColumn("Name").getModelIndex());
PTM ptm = ptmFactory.getPTM(ptmName);
PtmDialog ptmDialog = new PtmDialog(this, ptm, true);
if (!ptmDialog.isCanceled()) {
updateModifications();
}
}//GEN-LAST:event_viewDefaultPtmJMenuItemActionPerformed
/**
* Edit user PTM.
*
* @param evt
*/
private void editUserPtmJMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editUserPtmJMenuItemActionPerformed
String ptmName = (String) userModificationsTable.getValueAt(userModificationsTable.getSelectedRow(), userModificationsTable.getColumn("Name").getModelIndex());
PTM ptm = ptmFactory.getPTM(ptmName);
PtmDialog ptmDialog = new PtmDialog(this, ptm, true);
if (!ptmDialog.isCanceled()) {
updateModifications();
}
}//GEN-LAST:event_editUserPtmJMenuItemActionPerformed
/**
* Save the PTM details.
*
* @param evt
*/
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
// save any changes to the factory
try {
ptmFactory.saveFactory();
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "An error occurred while saving the modification.",
"Saving Error", JOptionPane.WARNING_MESSAGE);
}
dispose();
}//GEN-LAST:event_formWindowClosing
/**
* Close the dialog and updated the PTMs in the dialog parent.
*
* @param evt
*/
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
formWindowClosing(null);
}//GEN-LAST:event_okButtonActionPerformed
/**
* Change the cursor to a hand cursor.
*
* @param evt
*/
private void exportDefaultModsLabelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exportDefaultModsLabelMouseEntered
setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
}//GEN-LAST:event_exportDefaultModsLabelMouseEntered
/**
* Change the cursor back to the default cursor.
*
* @param evt
*/
private void exportDefaultModsLabelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exportDefaultModsLabelMouseExited
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_exportDefaultModsLabelMouseExited
/**
* Export the default modification to a user selected tab separated text
* file.
*
* @param evt
*/
private void exportDefaultModsLabelMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exportDefaultModsLabelMouseReleased
// get the file to send the output to
final File selectedFile = Util.getUserSelectedFile(this, ".txt", "Tab separated text file (.txt)", "Export...", "user.home", "default modifications.txt", false);
if (selectedFile != null) {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(selectedFile));
Util.tableToFile(defaultModificationsTable, "\t", null, true, writer);
writer.close();
JOptionPane.showMessageDialog(this, "Data copied to file:\n" + selectedFile.getAbsolutePath(), "Data Exported.", JOptionPane.INFORMATION_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "An error occurred when exporting the table content.", "Export Failed", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
}//GEN-LAST:event_exportDefaultModsLabelMouseReleased
/**
* Change the cursor to a hand cursor.
*
* @param evt
*/
private void exportUserModsLabelMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exportUserModsLabelMouseEntered
setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
}//GEN-LAST:event_exportUserModsLabelMouseEntered
/**
* Change the cursor back to the default cursor.
*
* @param evt
*/
private void exportUserModsLabelMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exportUserModsLabelMouseExited
setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
}//GEN-LAST:event_exportUserModsLabelMouseExited
/**
* Export the user modification to a user selected tab separated text file.
*
* @param evt
*/
private void exportUserModsLabelMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exportUserModsLabelMouseReleased
// get the file to send the output to
final File selectedFile = Util.getUserSelectedFile(this, ".txt", "Tab separated text file (.txt)", "Export...", "user.home", "user modifications.txt", false);
if (selectedFile != null) {
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(selectedFile));
Util.tableToFile(userModificationsTable, "\t", null, true, writer);
writer.close();
JOptionPane.showMessageDialog(this, "Data copied to file:\n" + selectedFile.getAbsolutePath(), "Data Exported.", JOptionPane.INFORMATION_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "An error occurred when exporting the table content.", "Export Failed", JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
}//GEN-LAST:event_exportUserModsLabelMouseReleased
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addUserPTM;
private javax.swing.JTable defaultModificationsTable;
private javax.swing.JPanel defaultModsPanel;
private javax.swing.JScrollPane defaultModsScrollPane;
private javax.swing.JPopupMenu defaultPtmPopupMenu;
private javax.swing.JButton deleteUserPTM;
private javax.swing.JButton editUserPTM;
private javax.swing.JMenuItem editUserPtmJMenuItem;
private javax.swing.JLabel exportDefaultModsLabel;
private javax.swing.JLabel exportUserModsLabel;
private javax.swing.JLabel findJLabel;
private javax.swing.JPanel modificationsEditorPanel;
private javax.swing.JButton modificationsHelpJButton;
private javax.swing.JSplitPane modificationsSplitPane;
private javax.swing.JButton okButton;
private javax.swing.JLabel searchIndexLabel;
private javax.swing.JTextField searchInputTxt;
private javax.swing.JButton searchNextButton;
private javax.swing.JButton searchPreviousButton;
private javax.swing.JTable userModificationsTable;
private javax.swing.JPanel userModsPanel;
private javax.swing.JScrollPane userModsScrollPane;
private javax.swing.JPopupMenu userPtmPopupMenu;
private javax.swing.JMenuItem viewDefaultPtmJMenuItem;
// End of variables declaration//GEN-END:variables
/**
* Table model for the default PTM table.
*/
private class DefaultPTMTable extends DefaultTableModel {
@Override
public int getRowCount() {
return ptmFactory.getDefaultModifications().size();
}
@Override
public int getColumnCount() {
return 7;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return " ";
case 1:
return "Name";
case 2:
return "Short";
case 3:
return "Mass";
case 4:
return "Type";
case 5:
return "Residues";
case 6:
return "CV";
default:
return "";
}
}
@Override
public Object getValueAt(int row, int column) {
String name = ptmFactory.getDefaultModificationsOrdered().get(row);
switch (column) {
case 0:
return row + 1;
case 1:
return name;
case 2:
return ptmFactory.getPTM(name).getShortName();
case 3:
return ptmFactory.getPTM(name).getMass();
case 4:
return ptmFactory.getPTM(name).getType();
case 5:
String residues = "";
AminoAcidPattern aminoAcidPattern = ptmFactory.getPTM(name).getPattern();
if (aminoAcidPattern != null) {
for (Character residue : aminoAcidPattern.getAminoAcidsAtTarget()) {
if (!residues.equals("")) {
residues += ", ";
}
residues += residue;
}
}
return residues;
case 6:
CvTerm cvTerm = ptmFactory.getPTM(name).getCvTerm();
if (cvTerm != null) {
if (cvTerm.getOntology().equalsIgnoreCase("UNIMOD")) {
return getUniModAccessionLink(cvTerm.getAccession());
} else { // psi-ms assumed
return getOlsAccessionLink(cvTerm.getAccession());
}
} else {
return null;
}
default:
return "";
}
}
@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 rowIndex, int columnIndex) {
return false;
}
}
/**
* Table model for the default PTM table.
*/
private class UserPTMTable extends DefaultTableModel {
@Override
public int getRowCount() {
return ptmFactory.getUserModifications().size();
}
@Override
public int getColumnCount() {
return 7;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return " ";
case 1:
return "Name";
case 2:
return "Short";
case 3:
return "Mass";
case 4:
return "Type";
case 5:
return "Residues";
case 6:
return "CV";
default:
return "";
}
}
@Override
public Object getValueAt(int row, int column) {
String name = ptmFactory.getUserModificationsOrdered().get(row);
switch (column) {
case 0:
return row + 1;
case 1:
return name;
case 2:
return ptmFactory.getPTM(name).getShortName();
case 3:
return ptmFactory.getPTM(name).getMass();
case 4:
return ptmFactory.getPTM(name).getType();
case 5:
String residues = "";
AminoAcidPattern aminoAcidPattern = ptmFactory.getPTM(name).getPattern();
if (aminoAcidPattern != null) {
for (Character residue : aminoAcidPattern.getAminoAcidsAtTarget()) {
if (!residues.equals("")) {
residues += ", ";
}
residues += residue;
}
}
return residues;
case 6:
CvTerm cvTerm = ptmFactory.getPTM(name).getCvTerm();
if (cvTerm != null) {
if (cvTerm.getOntology().equalsIgnoreCase("UNIMOD")) {
return getUniModAccessionLink(cvTerm.getAccession());
} else { // psi-ms assumed
return getOlsAccessionLink(cvTerm.getAccession());
}
} else {
return null;
}
default:
return "";
}
}
@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 rowIndex, int columnIndex) {
return false;
}
}
/**
* Returns a web link to the given PSI-MOD CV term at
* http://www.ebi.ac.uk/ontology-lookup.
*
* @param modAccession the PSI-MOD accession number
* @return the OLS web link
*/
public String getOlsAccessionLink(String modAccession) {
String accessionNumberWithLink = "<html><a href=\"http://www.ebi.ac.uk/ontology-lookup/?termId=" + modAccession + "\""
+ "\"><font color=\"" + selectedRowHtmlTagFontColor + "\">"
+ modAccession + "</font></a></html>";
return accessionNumberWithLink;
}
/**
* Returns a web link to the given Unimod CV term at
* http://www.ebi.ac.uk/ontology-lookup.
*
* @param unimodAccession the Unimod accession number
* @return the Unimod web link
*/
public String getUniModAccessionLink(String unimodAccession) {
String accessionNumber = unimodAccession.substring("Unimod:".length()); // remove 'Unimod:'
String accessionNumberWithLink = "<html><a href=\"http://www.unimod.org/modifications_view.php?editid1=" + accessionNumber + "\""
+ "\"><font color=\"" + selectedRowHtmlTagFontColor + "\">"
+ unimodAccession + "</font></a></html>";
return accessionNumberWithLink;
}
/**
* Updates the modification lists and tables.
*/
public void updateModifications() {
DefaultTableModel dm = (DefaultTableModel) defaultModificationsTable.getModel();
dm.fireTableDataChanged();
dm = (DefaultTableModel) userModificationsTable.getModel();
dm.fireTableDataChanged();
editUserPTM.setEnabled(userModificationsTable.getSelectedColumnCount() > 0);
deleteUserPTM.setEnabled(userModificationsTable.getSelectedColumnCount() > 0);
updateMassSparklines();
((TitledBorder) userModsPanel.getBorder()).setTitle("User Modifications (" + userModificationsTable.getRowCount() + ")");
userModsPanel.revalidate();
userModsPanel.repaint();
}
/**
* Updates the PTM selection in the default table.
*/
public void updatePtmSelection() {
int row = defaultModificationsTable.convertRowIndexToView(searchPossibilities.get(searchCurrentSelection));
defaultModificationsTable.setRowSelectionInterval(row, row);
searchIndexLabel.setText("(" + (searchCurrentSelection + 1) + " of " + searchPossibilities.size() + ")");
defaultModificationsTable.scrollRectToVisible(defaultModificationsTable.getCellRect(row, 0, false));
}
}