/*
* EuroCarbDB, a framework for carbohydrate bioinformatics
*
* Copyright (c) 2006-2009, Eurocarb project, or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
* A copy of this license accompanies this distribution in the file LICENSE.txt.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* Last commit: $Rev: 1930 $ by $Author: david@nixbioinf.org $ on $Date:: 2010-07-29 #$
*/
/**
@author Alessio Ceroni (a.ceroni@imperial.ac.uk)
*/
package org.eurocarbdb.application.glycoworkbench.plugin;
import org.eurocarbdb.application.glycanbuilder.*;
import org.eurocarbdb.application.glycoworkbench.*;
import java.io.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;
import javax.swing.event.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import java.util.*;
import java.awt.print.*;
public class SearchSummaryPanel extends SortingTablePanel<AnnotatedPeakList> implements ActionListener, AnnotatedPeakList.AnnotationChangeListener {
// components
protected JToolBar theToolBar;
protected boolean update_header;
//
public SearchSummaryPanel() {
super();
}
protected void initComponents() {
super.initComponents();
// create toolbar
theToolBar = createToolBar();
add(theToolBar,BorderLayout.SOUTH);
}
public AnnotatedPeakList getDocumentFromWorkspace(GlycanWorkspace workspace) {
return ( workspace!=null ) ?workspace.getSearchResults() :null;
}
public void setDocumentFromWorkspace(GlycanWorkspace workspace) {
if( theDocument!=null )
theDocument.removeAnnotationChangeListener(this);
theDocument = getDocumentFromWorkspace(workspace);
if( theDocument==null )
theDocument = new AnnotatedPeakList();
theDocument.addAnnotationChangeListener(this);
update_header = true;
updateView();
updateActions();
}
protected void createActions() {
theActionManager.add("new",FileUtils.defaultThemeManager.getImageIcon("new"),"Clear all",KeyEvent.VK_N, "",this);
theActionManager.add("open",FileUtils.defaultThemeManager.getImageIcon("open"),"Open",KeyEvent.VK_O, "",this);
theActionManager.add("save",FileUtils.defaultThemeManager.getImageIcon("save"),"Save",KeyEvent.VK_S, "",this);
theActionManager.add("saveas",FileUtils.defaultThemeManager.getImageIcon("saveas"),"Save as...",KeyEvent.VK_A, "",this);
theActionManager.add("print",FileUtils.defaultThemeManager.getImageIcon("print"),"Print...",KeyEvent.VK_P, "",this);
// edit
//theActionManager.add("undo",FileUtils.defaultThemeManager.getImageIcon("undo"),"Undo",KeyEvent.VK_U, "",this);
//theActionManager.add("redo",FileUtils.defaultThemeManager.getImageIcon("redo"),"Redo", KeyEvent.VK_R, "",this);
theActionManager.add("cut",FileUtils.defaultThemeManager.getImageIcon("cut"),"Cut",-1, "",this);
theActionManager.add("copy",FileUtils.defaultThemeManager.getImageIcon("copy"),"Copy",KeyEvent.VK_C, "",this);
theActionManager.add("delete",FileUtils.defaultThemeManager.getImageIcon("delete"),"Delete",-1, "",this);
theActionManager.add("transfer",FileUtils.defaultThemeManager.getImageIcon("transfer"),"Copy fragments into canvas",KeyEvent.VK_V, "",this);
theActionManager.add("annotate",FileUtils.defaultThemeManager.getImageIcon("annotate"),"Add to the annotated peak list",KeyEvent.VK_V, "",this);
theActionManager.add("goto",FileUtils.defaultThemeManager.getImageIcon("goto"),"Jump to a specific m/z value",-1, "",this);
theActionManager.add("filterselection",FileUtils.defaultThemeManager.getImageIcon(""),"Show only selected annotations",-1, "",this);
theActionManager.add("showallrows",FileUtils.defaultThemeManager.getImageIcon(""),"Show all annotations",-1, "",this);
theActionManager.add("addIsotopeCurves",FileUtils.defaultThemeManager.getImageIcon(""),"Show isotopic distributions",-1, "",this);
}
protected void updateActions() {
theActionManager.get("save").setEnabled(theDocument.hasChanged());
//theActionManager.get("undo").setEnabled(theDocument.getUndoManager().canUndo());
//theActionManager.get("redo").setEnabled(theDocument.getUndoManager().canRedo());
boolean has_selection = theTable.getSelectedRows().length>0;
theActionManager.get("cut").setEnabled(has_selection);
theActionManager.get("copy").setEnabled(has_selection);
theActionManager.get("delete").setEnabled(has_selection);
theActionManager.get("transfer").setEnabled(has_selection);
theActionManager.get("annotate").setEnabled(has_selection);
theActionManager.get("goto").setEnabled(getRowCount()>0);
theActionManager.get("filterselection").setEnabled(has_selection);
theActionManager.get("showallrows").setEnabled(!theTableSorter.isAllRowsVisible());
theActionManager.get("addIsotopeCurves").setEnabled(has_selection);
}
private JToolBar createToolBar() {
JToolBar toolbar = new JToolBar();
toolbar.setFloatable(false);
toolbar.add(theActionManager.get("print"));
toolbar.addSeparator();
toolbar.add(theActionManager.get("cut"));
toolbar.add(theActionManager.get("copy"));
toolbar.add(theActionManager.get("delete"));
toolbar.addSeparator();
toolbar.add(theActionManager.get("transfer"));
toolbar.add(theActionManager.get("annotate"));
toolbar.addSeparator();
toolbar.add(theActionManager.get("goto"));
return toolbar;
}
protected JPopupMenu createPopupMenu() {
JPopupMenu menu = new JPopupMenu();
menu.add(theActionManager.get("cut"));
menu.add(theActionManager.get("copy"));
menu.add(theActionManager.get("delete"));
menu.addSeparator();
menu.add(theActionManager.get("transfer"));
menu.add(theActionManager.get("annotate"));
menu.addSeparator();
menu.add(theActionManager.get("filterselection"));
menu.add(theActionManager.get("showallrows"));
menu.add(theActionManager.get("addIsotopeCurves"));
return menu;
}
//---------------
// table model
public Class<?> getColumnClass(int columnIndex) {
if( columnIndex==0 )
return Double.class;
if( columnIndex==1 )
return Double.class;
if( columnIndex==2 )
return Double.class;
return Vector.class;
}
public String getColumnName(int columnIndex) {
if( columnIndex==0 )
return "Mass to\ncharge";
if( columnIndex==1 )
return "Intensity";
if( columnIndex==2 )
return "Relative\nintensity";
return "Structure" + (columnIndex-3);
}
public int getColumnCount() {
return 3 + theDocument.getNoStructures();
}
public int getRowCount() {
return theDocument.getNoPeaks();
}
public Object getValueAt(int rowIndex, int columnIndex) {
if( columnIndex==0 )
return theDocument.getMZ(rowIndex);
if( columnIndex==1 )
return theDocument.getIntensity(rowIndex);
if( columnIndex==2 )
return theDocument.getRelativeIntensity(rowIndex);
return theDocument.getFragments(rowIndex,columnIndex-3);
}
//-----------------
// data
public void clear() {
theDocument.clear();
}
//-----------
// Visualization
public void updateData() {
}
public void updateView() {
if( update_header ) {
// change number of columns
fireTableStructureChanged();
// set structures in header
for( int i=0; i<theDocument.getNoStructures(); i++ )
theTable.getColumn("Structure"+i).setHeaderValue(theDocument.getStructure(i));
update_header = false;
}
super.updateView();
}
//-----------------
// actions
public void onNew() {
clear();
}
public void onPrint() {
theTable.print(theWorkspace.getPrinterJob());
}
/*public void onUndo() {
try {
theDocument.getUndoManager().undo();
}
catch(Exception e) {
LogUtils.report(e);
}
}
public void onRedo() {
try {
theDocument.getUndoManager().redo();
}
catch(Exception e) {
LogUtils.report(e);
}
}
*/
public void cut() {
copy();
delete();
}
public void delete() {
if( theDocument.getNoStructures()>0 ) {
// suppress automatic update
ignore_document_changes = true;
// collect selected peaks
Vector<Peak> peaks = new Vector<Peak>();
int[] sel_ind = theTable.getSelectedRows();
for( int i=0; i<sel_ind.length; i++ )
peaks.add(theDocument.getPeak(theTableSorter.modelIndex(sel_ind[i])));
// clear annotations
theDocument.clearAnnotationsFor(peaks);
// update table
fireRowsChanged(sel_ind);
// restore automatic update
ignore_document_changes = false;
}
}
public void copy() {
// get selected rows
int[] sel_inds = theTable.getSelectedRows();
if( sel_inds.length>0 ) {
// get selection
int focusRow = theTable.getSelectionModel().getLeadSelectionIndex();
int focusColumn = theTable.getColumnModel().getSelectionModel().getLeadSelectionIndex();
Collection<Glycan> structures = null;
if( focusRow!=-1 && focusColumn!=-1 ) {
Object v = getValueAt(focusRow, focusColumn);
if( v instanceof Collection ) {
Collection cv = (Collection)v;
if( cv.size()>0 && (cv.iterator().next() instanceof Glycan) )
structures = cv;
}
}
int[] mod_inds = theTableSorter.modelIndexes(sel_inds);
if( structures!=null )
ClipUtils.setContents(new AnnotationSelection(theTable.getSelectedData(),theDocument.extractAnnotations(mod_inds),theWorkspace.getGlycanRenderer(),structures));
else
ClipUtils.setContents(new AnnotationSelection(theTable.getSelectedData(),theDocument.extractAnnotations(mod_inds)));
}
}
public void transfer() {
GlycanCanvas theCanvas = theApplication.getCanvas();
this.copy();
theCanvas.resetSelection();
theCanvas.paste();
}
public void annotate() {
int[] sel_ind = theTable.getSelectedRows();
if( sel_ind.length>0 ) {
Vector<Peak> p_toadd = new Vector<Peak>();
AnnotatedPeakList apl_toadd = new AnnotatedPeakList();
for( int l=0; l<theDocument.getNoStructures(); l++ ) {
Glycan structure = theDocument.getStructure(l);
PeakAnnotationCollection pac = theDocument.getPeakAnnotationCollection(l);
for( int i=0; i<sel_ind.length; i++ ) {
int r = theTableSorter.modelIndex(sel_ind[i]);
apl_toadd.addPeakAnnotation(structure,pac.getPeakAnnotation(r),true);
p_toadd.add(pac.getPeak(r));
}
}
theWorkspace.getAnnotatedPeakList().merge(apl_toadd);
theWorkspace.getPeakList().addAll(p_toadd);
}
}
public void goToMZ() {
String m_z = JOptionPane.showInputDialog(theApplication, "Insert m/z value");
if( m_z!=null ) {
int mod_ind = theDocument.nearestTo(Double.valueOf(m_z));
if( mod_ind!=-1 ) {
int sel_ind = theTableSorter.viewIndex(mod_ind);
theTable.setRowSelectionInterval(sel_ind,sel_ind);
theTable.scrollRectToVisible(theTable.getCellRect(sel_ind,0,false));
}
}
}
public void filterSelection() {
int[] sel_inds = theTable.getSelectedRows();
if( sel_inds!=null & sel_inds.length>0 )
theTableSorter.setVisibleRows(theTableSorter.modelIndexes(sel_inds));
}
public void showAllRows() {
theTableSorter.resetVisibleRows();
}
public void addIsotopeCurves() {
int focusRow = theTable.getSelectionModel().getLeadSelectionIndex();
int focusColumn = theTable.getColumnModel().getSelectionModel().getLeadSelectionIndex();
if( focusRow==-1 || focusColumn==-1 )
return;
PeakAnnotationMultiple pam = theDocument.getAnnotations(theTableSorter.modelIndex(focusRow));
TreeMap<Peak,Collection<Annotation>> annotations = new TreeMap<Peak,Collection<Annotation>>();
annotations.put(pam.getPeak(),pam.getAnnotations(focusColumn-3));
try {
theApplication.getPluginManager().runAction("Spectra","addIsotopeCurves",annotations);
theApplication.getPluginManager().runAction("PeakList","addIsotopeCurves",annotations);
}
catch(Exception e) {
LogUtils.report(e);
}
}
//-----------
// listeners
public void actionPerformed(ActionEvent e) {
String action = e.getActionCommand();
if( action.equals("print") )
onPrint();
else if( action.equals("cut") )
cut();
else if( action.equals("copy") )
copy();
else if( action.equals("delete") )
cut();
else if( action.equals("transfer") )
transfer();
else if( action.equals("annotate") )
annotate();
else if( action.equals("goto") )
goToMZ();
else if( action.equals("filterselection") )
filterSelection();
else if( action.equals("showallrows") )
showAllRows();
else if( action.equals("addIsotopeCurves") )
addIsotopeCurves();
updateActions();
}
public void structuresChanged(AnnotatedPeakList.AnnotationChangeEvent e) {
if( !ignore_document_changes ) {
update_header = true;
updateDocument();
}
}
public void annotationsChanged(AnnotatedPeakList.AnnotationChangeEvent e) {
if( !ignore_document_changes )
updateDocument();
}
public void documentInit(BaseDocument.DocumentChangeEvent e) {
if( !ignore_document_changes ) {
update_header = true;
super.documentInit(e);
}
}
public void documentChanged(BaseDocument.DocumentChangeEvent e) {
if( !ignore_document_changes ) {
update_header = true;
super.documentChanged(e);
}
}
}