/*
* 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 java.net.MalformedURLException;
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.text.*;
import java.awt.print.*;
public class DictionariesSearchPanel extends TablePanel<ProfilerPlugin> implements ActionListener, ChangeListener {
// class
private class DictionaryEntry {
public DictionaryEntry(StructureType src) throws Exception {
structure = src.generateStructure(theWorkspace.getDefaultMassOptions());
type = src.getType();
source = src.getSource();
database = src.getDatabase();
mz_ratio = structure.computeMZ();
generator = src;
}
public Glycan structure;
public String type;
public String source;
public String database;
public Double mz_ratio;
public StructureType generator;
}
private static final int ROWS = 10;
// components
private JToolBar theToolBarNavigation;
private JToolBar theToolBarDocument;
private JSlider theDictionarySlider;
private JLabel theDictionaryStatus;
// data
private int current_page_start;
private Collection<StructureType> entries;
private Vector<DictionaryEntry> ordered_entries;
private Vector<DictionaryEntry> shown_entries;
private boolean ignore_slider = false;
private boolean ignore_selector = false;
public DictionariesSearchPanel(ProfilerPlugin profiler) {
super();
setProfiler(profiler);
setData(new Vector<StructureType>());
}
protected void initComponents() {
super.initComponents();
// create dictionary selector
theDictionarySlider = new JSlider();
theDictionarySlider.addChangeListener(this);
theDictionaryStatus = new JLabel("");
JPanel top_panel = new JPanel(new BorderLayout());
top_panel.add(theDictionarySlider,BorderLayout.CENTER);
top_panel.add(theDictionaryStatus,BorderLayout.EAST);
add(top_panel,BorderLayout.NORTH);
// set dictionary table
theTable.setGlycanScale(0.35);
// set the toolbars
JPanel bottom_panel = new JPanel(new BorderLayout());
bottom_panel.add(theToolBarNavigation = createToolBarNavigation(), BorderLayout.NORTH);
bottom_panel.add(theToolBarDocument = createToolBarDocument(), BorderLayout.CENTER);
add(bottom_panel,BorderLayout.SOUTH);
}
protected ProfilerPlugin getDocumentFromWorkspace(GlycanWorkspace workspace) {
return null;
}
protected void setDocumentFromWorkspace(GlycanWorkspace workspace) {
}
public void setProfiler(ProfilerPlugin profiler) {
theDocument = profiler;
}
public void setData(Collection<StructureType> _entries) {
entries = _entries;
current_page_start = 0;
updateData();
updateActions();
updateView();
}
public Collection<StructureType> getData() {
return entries;
}
protected void createActions() {
theActionManager.add("first",FileUtils.defaultThemeManager.getImageIcon("first"),"First page",-1, "",this);
theActionManager.add("pprevious",FileUtils.defaultThemeManager.getImageIcon("pprevious"),"Five pages before",-1, "",this);
theActionManager.add("previous",FileUtils.defaultThemeManager.getImageIcon("previous"),"Previous page",-1, "",this);
theActionManager.add("next",FileUtils.defaultThemeManager.getImageIcon("next"),"Next page",-1, "",this);
theActionManager.add("nnext",FileUtils.defaultThemeManager.getImageIcon("nnext"),"Five pages after",-1, "",this);
theActionManager.add("last",FileUtils.defaultThemeManager.getImageIcon("last"),"Last page",-1, "",this);
theActionManager.add("print",FileUtils.defaultThemeManager.getImageIcon("print"),"Print...",KeyEvent.VK_P, "",this);
theActionManager.add("copy",FileUtils.defaultThemeManager.getImageIcon("copy"),"Copy",KeyEvent.VK_C, "",this);
theActionManager.add("transfer",FileUtils.defaultThemeManager.getImageIcon("transfer"),"Copy structures to canvas",KeyEvent.VK_V, "",this);
theActionManager.add("goto",FileUtils.defaultThemeManager.getImageIcon("goto"),"Jump to a specific m/z value",-1, "",this);
theActionManager.add("search",FileUtils.defaultThemeManager.getImageIcon("search"),"Search the dictionary",-1, "",this);
theActionManager.add("searchagain",FileUtils.defaultThemeManager.getImageIcon("searchagain"),"Search in the current results",-1, "",this);
theActionManager.add("clearsearch",FileUtils.defaultThemeManager.getImageIcon("clearsearch"),"Clear search",-1, "",this);
}
protected void updateActions() {
boolean has_selection = theTable.getSelectedRows().length>0;
theActionManager.get("first").setEnabled(current_page_start>0);
theActionManager.get("pprevious").setEnabled(current_page_start>0);
theActionManager.get("previous").setEnabled(current_page_start>0);
if( ordered_entries!=null ) {
theActionManager.get("next").setEnabled(current_page_start<ordered_entries.size()-ROWS);
theActionManager.get("nnext").setEnabled(current_page_start<ordered_entries.size()-ROWS);
theActionManager.get("last").setEnabled(current_page_start<ordered_entries.size()-ROWS);
}
else {
theActionManager.get("next").setEnabled(false);
theActionManager.get("nnext").setEnabled(false);
theActionManager.get("last").setEnabled(false);
}
theActionManager.get("copy").setEnabled(has_selection);
theActionManager.get("transfer").setEnabled(has_selection);
}
private JToolBar createToolBarNavigation() {
JToolBar toolbar = new JToolBar();
toolbar.setFloatable(false);
toolbar.add(theActionManager.get("first"));
toolbar.add(theActionManager.get("pprevious"));
toolbar.add(theActionManager.get("previous"));
toolbar.add(theActionManager.get("next"));
toolbar.add(theActionManager.get("nnext"));
toolbar.add(theActionManager.get("last"));
return toolbar;
}
private JToolBar createToolBarDocument() {
JToolBar toolbar = new JToolBar();
toolbar.setFloatable(false);
toolbar.add(theActionManager.get("print"));
toolbar.addSeparator();
toolbar.add(theActionManager.get("copy"));
toolbar.add(theActionManager.get("transfer"));
toolbar.addSeparator();
toolbar.add(theActionManager.get("goto"));
toolbar.add(theActionManager.get("search"));
toolbar.add(theActionManager.get("searchagain"));
toolbar.add(theActionManager.get("clearsearch"));
return toolbar;
}
protected JPopupMenu createPopupMenu() {
JPopupMenu menu = new JPopupMenu();
menu.add(theActionManager.get("copy"));
menu.add(theActionManager.get("transfer"));
return menu;
}
//---------------
// table model
public Class<?> getColumnClass(int columnIndex) {
if( columnIndex==0 )
return Glycan.class;
if( columnIndex==1 )
return String.class;
if( columnIndex==2 )
return String.class;
if( columnIndex==3 )
return String.class;
if( columnIndex==4 )
return Double.class;
return Object.class;
}
public String getColumnName(int columnIndex) {
if( columnIndex==0 )
return "Structure";
if( columnIndex==1 )
return "Type";
if( columnIndex==2 )
return "Source";
if( columnIndex==3 )
return "Database";
if( columnIndex==4 )
return "m/z";
return null;
}
public int getColumnCount() {
return 5;
}
public int getRowCount() {
if( ordered_entries==null )
return 0;
return Math.min(ROWS,ordered_entries.size()-current_page_start);
}
public Object getValueAt(int rowIndex, int columnIndex) {
if( columnIndex==0 )
return shown_entries.get(rowIndex).structure;
if( columnIndex==1 )
return shown_entries.get(rowIndex).type;
if( columnIndex==2 )
return shown_entries.get(rowIndex).source;
if( columnIndex==2 )
return shown_entries.get(rowIndex).database;
if( columnIndex==4 )
return shown_entries.get(rowIndex).mz_ratio;
return null;
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
}
//-----------
// Visualization
public void updateData() {
ordered_entries = new Vector<DictionaryEntry>();
try {
if( entries!=null ) {
for( StructureType st : entries ) {
DictionaryEntry de = new DictionaryEntry(st);
de.structure = null; // free memory
ordered_entries.add(de);
}
Collections.sort(ordered_entries, new Comparator<DictionaryEntry>() {
public int compare(DictionaryEntry a, DictionaryEntry b) {
if( a.mz_ratio<b.mz_ratio )
return -1;
if( a.mz_ratio>b.mz_ratio )
return 1;
return 0;
}
});
}
}
catch(Exception e) {
LogUtils.report(e);
ordered_entries.clear();
}
System.out.println(ordered_entries.size());
// check current_page_start
current_page_start = Math.max(0,Math.min(current_page_start,ordered_entries.size() - (ordered_entries.size()%ROWS)));
}
public void updateShownEntries() {
shown_entries = new Vector<DictionaryEntry>();
try {
for( int i=current_page_start; i<current_page_start+ROWS && i<ordered_entries.size(); i++ )
shown_entries.add(new DictionaryEntry(ordered_entries.get(i).generator));
}
catch(Exception e) {
LogUtils.report(e);
shown_entries.clear();
}
}
public void updateSlider() {
if( theDictionarySlider!=null ) {
ignore_slider = true;
if( ordered_entries==null ) {
theDictionarySlider.setMinimum(0);
theDictionarySlider.setMaximum(1);
theDictionarySlider.setValue(0);
}
else {
theDictionarySlider.setMinimum(0);
theDictionarySlider.setMaximum(ordered_entries.size()/ROWS);
theDictionarySlider.setValue(current_page_start/ROWS);
}
ignore_slider = false;
}
}
public void updateStatus() {
if( theDictionaryStatus!=null ) {
String title = current_page_start + "/" + ordered_entries.size();
theDictionaryStatus.setText(title);
}
}
public void updateView() {
updateSlider();
updateStatus();
updateShownEntries();
fireTableChanged();
}
public void updateMasses() {
updateData();
updateActions();
updateView();
}
public void showFirst() {
if( current_page_start>0 ) {
current_page_start=0;
updateActions();
updateView();
}
}
public void showFiveBefore() {
if( current_page_start>0 ) {
current_page_start = Math.max(0,current_page_start-ROWS*5);
updateActions();
updateView();
}
}
public void showPrevious() {
if( current_page_start>0 ) {
current_page_start = Math.max(0,current_page_start-ROWS);
updateActions();
updateView();
}
}
public void showNext() {
if( current_page_start<ordered_entries.size()-ROWS ) {
current_page_start += ROWS;
updateActions();
updateView();
}
}
public void showFiveAfter() {
if( current_page_start<ordered_entries.size()-ROWS ) {
current_page_start = Math.min(current_page_start+5*ROWS,ordered_entries.size() - (ordered_entries.size()%ROWS));
updateActions();
updateView();
}
}
public void showLast() {
if( current_page_start<ordered_entries.size()-ROWS ) {
current_page_start = ordered_entries.size() - (ordered_entries.size()%ROWS);
updateActions();
updateView();
}
}
public void onPrint() {
theTable.print(theWorkspace.getPrinterJob(),null);
}
public void copy() {
// get selected rows
Vector<Glycan> structures = new Vector<Glycan>();
Vector<StructureType> structure_types = new Vector<StructureType>();
for( int sel_ind : theTable.getSelectedRows() ) {
structures.add(shown_entries.get(sel_ind).structure);
structure_types.add(shown_entries.get(sel_ind).generator);
}
if( structures.size()>0 ) {
// get annotations
ClipUtils.setContents(new DictionarySelection(theTable.getSelectedData(),structure_types,theWorkspace.getGlycanRenderer(),structures));
}
}
public void transfer() {
GlycanCanvas theCanvas = theApplication.getCanvas();
this.copy();
theCanvas.resetSelection();
theCanvas.paste();
}
public void goToMZ() {
String mz_str = JOptionPane.showInputDialog(this, "Insert m/z value");
if( mz_str!=null ) {
Double mz_ratio = Double.valueOf(mz_str);
int i=ROWS;
for( ; i<ordered_entries.size() && mz_ratio>ordered_entries.get(i).mz_ratio; i+=ROWS );
current_page_start = Math.max(0,i-ROWS);
updateActions();
updateView();
}
}
//-----------
// listeners
public void stateChanged(ChangeEvent e) {
if( !ignore_slider ) {
current_page_start = theDictionarySlider.getValue()*ROWS;
updateActions();
updateView();
}
}
public void actionPerformed(ActionEvent e) {
String action = e.getActionCommand();
if( action.equals("first") )
showFirst();
else if( action.equals("pprevious") )
showFiveBefore();
else if( action.equals("previous") )
showPrevious();
else if( action.equals("next") )
showNext();
else if( action.equals("nnext") )
showFiveAfter();
else if( action.equals("last") )
showLast();
else if( action.equals("print") )
onPrint();
else if( action.equals("copy") )
copy();
else if( action.equals("transfer") )
transfer();
else if( action.equals("search") )
try {
theDocument.search(null,null,false);
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
else if( action.equals("searchagain") )
try {
theDocument.search(null,null,true);
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
else if( action.equals("clearsearch") )
setData(new Vector<StructureType>());
else if( action.equals("goto") )
goToMZ();
updateActions();
}
}