/* * 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 org.pushingpixels.flamingo.api.common.icon.ResizableIcon; import org.pushingpixels.flamingo.api.ribbon.JRibbonBand; import org.pushingpixels.flamingo.api.ribbon.RibbonTask; import java.util.Collections; import java.util.Collection; import java.util.List; import java.util.Vector; import javax.swing.ImageIcon; import javax.swing.JTabbedPane; import javax.swing.JOptionPane; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; public class FragmentsPlugin implements Plugin, ActionListener { PluginManager theManager = null; GlycoWorkbench theApplication = null; GlycanWorkspace theWorkspace = null; JTabbedPane theFragmentToolsPane = null; FragmentDetailsPanel theFragmentDetailsPanel = null; FragmentSummaryPanel theFragmentSummaryPanel = null; FragmentEditorPanel theFragmentEditorPanel = null; public FragmentsPlugin(GlycoWorkbench bench) { theFragmentDetailsPanel = new FragmentDetailsPanel(); theFragmentSummaryPanel = new FragmentSummaryPanel(); theFragmentEditorPanel = new FragmentEditorPanel(); theFragmentToolsPane = new JTabbedPane(); theFragmentToolsPane.add("Details", theFragmentDetailsPanel); theFragmentToolsPane.add("Summary", theFragmentSummaryPanel); theFragmentToolsPane.add("Editor", theFragmentEditorPanel); this.theApplication=bench; } public void init() { } public void exit() { } public String getName() { return "Fragments"; } public int getMnemonic() { return KeyEvent.VK_F; } public ResizableIcon getResizableIcon(){ return FileUtils.getThemeManager().getResizableIcon("computefragments", ICON_SIZE.L3).getResizableIcon(); } public ImageIcon getIcon() { return ThemeManager.getEmptyIcon(ICON_SIZE.TINY); } public int getViewPosition(String view) { return PluginManager.VIEW_RIGHT; } public java.awt.Component getLeftComponent() { return null; } public java.awt.Component getRightComponent() { return theFragmentToolsPane; } public java.awt.Component getBottomComponent() { return null; } public FragmentDetailsPanel getFragmentDetailsPanel() { return theFragmentDetailsPanel; } public FragmentSummaryPanel getFragmentSummaryPanel() { return theFragmentSummaryPanel; } public FragmentEditorPanel getFragmentEditorPanel() { return theFragmentEditorPanel; } public Collection<String> getViews() { Vector<String> views = new Vector<String>(); views.add("Details"); views.add("Summary"); views.add("Editor"); return views; } public Collection<GlycanAction> getActions() { Vector<GlycanAction> actions = new Vector<GlycanAction>(); actions.add(new GlycanAction("options",ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3),"Set plugin options",KeyEvent.VK_O,"",this)); actions.add(null); actions.add(new GlycanAction("editFragmentsCurrent",ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3),"Edit fragments for current structure",KeyEvent.VK_T,"",this)); actions.add(new GlycanAction("editFragmentsResidue",ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3),"Show fragments at current residue",KeyEvent.VK_R,"",this)); actions.add(new GlycanAction("editFragmentsLinkage",ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3),"Show fragments at current linkage",KeyEvent.VK_L,"",this)); actions.add(null); actions.add(new GlycanAction("computeFragmentsCurrent",ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3),"Compute fragments for current structure",KeyEvent.VK_C,"",this)); actions.add(new GlycanAction("computeFragmentsSelected",this.theApplication.getThemeManager().getResizableIcon("computefragments", ICON_SIZE.L3),"Compute fragments for selected structures",KeyEvent.VK_S,"",this)); actions.add(new GlycanAction("computeFragmentsAll",ThemeManager.getResizableEmptyIcon(ICON_SIZE.L3),"Compute fragments for all structures",KeyEvent.VK_A,"",this)); return actions; } public Collection<GlycanAction> getToolbarActions() { Vector<GlycanAction> actions = new Vector<GlycanAction>(); actions.add(new GlycanAction("computeFragmentsSelected",this.theApplication.getThemeManager().getResizableIcon("computefragments", ICON_SIZE.L3),"Compute fragments for selected structures",KeyEvent.VK_S,"",this)); return actions; } public Collection<GlycanAction> getObjectActions(Object prototype, ActionListener al) { Vector<GlycanAction> actions = new Vector<GlycanAction>(); return actions; } public void setManager(PluginManager manager) { theManager = manager; } public void setApplication(GlycoWorkbench application) { theApplication = application; theFragmentDetailsPanel.setApplication(application); theFragmentSummaryPanel.setApplication(application); theFragmentEditorPanel.setApplication(application); } public void setWorkspace(GlycanWorkspace workspace) { theWorkspace = workspace; theFragmentDetailsPanel.setWorkspace(workspace); theFragmentSummaryPanel.setWorkspace(workspace); theFragmentEditorPanel.setWorkspace(workspace); } public PluginManager getManager() { return theManager; } public GlycoWorkbench getApplication() { return theApplication; } public GlycanWorkspace getWorkspace() { return theWorkspace; } public void show(String view) throws Exception { if( view.equals("Details") ) theFragmentToolsPane.setSelectedComponent(theFragmentDetailsPanel); else if( view.equals("Summary") ) theFragmentToolsPane.setSelectedComponent(theFragmentSummaryPanel); else if( view.equals("Editor") ) theFragmentToolsPane.setSelectedComponent(theFragmentEditorPanel); else throw new Exception("Invalid view: " + view); } public boolean runAction(String action) throws Exception { if( action.equals("options") ) return setOptions(); if( action.equals("editFragmentsCurrent") ) { theApplication.getCanvas().enforceSelection(); if( theFragmentEditorPanel.setStructure(theApplication.getCanvas().getCurrentStructure()) ) { theManager.show("Fragments","Editor"); return true; } return false; } if( action.equals("editFragmentsResidue") ) { if( theFragmentEditorPanel.setStructure(theApplication.getCanvas().getCurrentStructure(),theApplication.getCanvas().getCurrentResidue()) ) { theManager.show("Fragments","Editor"); return true; } return false; } if( action.equals("editFragmentsLinkage") ) { if( theFragmentEditorPanel.setStructure(theApplication.getCanvas().getCurrentStructure(),theApplication.getCanvas().getCurrentLinkage()) ) { theManager.show("Fragments","Editor"); return true; } return false; } if( action.equals("computeFragmentsCurrent") ) { theApplication.getCanvas().enforceSelection(); if( computeAllFragments(Collections.singleton(theApplication.getCanvas().getCurrentStructure())) ) { theManager.show("Fragments","Details"); return true; } return false; } if( action.equals("computeFragmentsSelected") ) { theApplication.getCanvas().enforceSelection(); if( computeAllFragments(theApplication.getCanvas().getSelectedStructures()) ) { theManager.show("Fragments","Details"); return true; } return false; } if( action.equals("computeFragmentsAll") ) { if( computeAllFragments(theWorkspace.getStructures().getStructures()) ) { theManager.show("Fragments","Details"); return true; } return false; } throw new Exception("Invalid action: " + action); } public boolean runAction(String action, Object params) throws Exception { return runAction(action); } public void actionPerformed(ActionEvent e) { try { runAction(GlycanAction.getAction(e)); } catch(Exception ex) { LogUtils.report(ex); } } public void updateViews() { theFragmentDetailsPanel.updateView(); theFragmentSummaryPanel.updateView(); theFragmentEditorPanel.updateView(); } public void updateMasses() { } // ---- // Actions public boolean setOptions() { FragmentOptions frag_opt = theWorkspace.getFragmentOptions(); FragmentOptionsDialog dlg = new FragmentOptionsDialog(theApplication,frag_opt); dlg.setVisible(true); if( !dlg.getReturnStatus().equals("OK") ) return false; return true; } public boolean computeAllFragments(Collection<Glycan> structures) { if( structures==null || structures.size()==0 ) return false; // show fragments dialog FragmentOptions frag_opt = theWorkspace.getFragmentOptions(); AnnotationOptions ann_opt = theWorkspace.getAnnotationOptions(); FragmentOptionsDialog dlg = new FragmentOptionsDialog(theApplication,frag_opt); dlg.setVisible(true); if( !dlg.getReturnStatus().equals("OK") ) return false; // create fragmenter Fragmenter frag = new Fragmenter(frag_opt); // check for linkages if( frag.getComputeAFragments() || frag.getComputeXFragments() ) { for( Glycan s : structures ) { if( !s.checkLinkages() ) { if( JOptionPane.showConfirmDialog(theApplication, "Cross ring fragments will not be computed for residues with incomplete linkage or anomeric information. Continue?", "Warning", JOptionPane.YES_NO_OPTION)==JOptionPane.NO_OPTION ) return false; else break; } } } // halt interactions theApplication.haltInteractions(); // compute fragments int no_structures = 0; boolean has_fuzzy = false; boolean has_not_fuzzy = true; FragmentDocument results = new FragmentDocument(); for( Glycan structure : structures ) { if( structure!=null ) { no_structures++; if( structure.isFuzzy(true) ) has_fuzzy = true; else { has_not_fuzzy = true; results.addFragments(structure,frag.computeAllFragments(structure)); } } } theWorkspace.getFragments().copy(results); // restore interactions theApplication.restoreInteractions(); // show fragments if( no_structures>0 ) { if( has_fuzzy ) { if( structures.size()==1 ) JOptionPane.showMessageDialog(theApplication, "Cannot compute fragments for structures with uncertain terminals", "Error", JOptionPane.ERROR_MESSAGE); else if( has_not_fuzzy ) JOptionPane.showMessageDialog(theApplication, "Cannot compute fragments for some structures with uncertain terminals", "Error", JOptionPane.ERROR_MESSAGE); else JOptionPane.showMessageDialog(theApplication, "Cannot compute fragments, all structures have uncertain terminals", "Error", JOptionPane.ERROR_MESSAGE); } } return true; } @Override public void completeSetup() { // TODO Auto-generated method stub } @Override public List<JRibbonBand> getBandsForToolBar() { // TODO Auto-generated method stub return null; } @Override public RibbonTask getRibbonTask() { // TODO Auto-generated method stub return null; } }