Project: bioclipse.speclipse
/*****************************************************************************
 * Copyright (c) 2008 Bioclipse Project 
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Eclipse Public License v1.0 
 * which accompanies this distribution, and is available at 
 * http://www.eclipse.org/legal/epl-v10.html 
 * 
 *****************************************************************************/
package net.bioclipse.specmol.editor; 
 
import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.Frame; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
 
import org.eclipse.swt.awt.SWT_AWT; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Composite; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.annotations.XYAnnotation; 
import org.jfree.chart.annotations.XYLineAnnotation; 
import org.jfree.chart.plot.XYPlot; 
import org.xmlcml.cml.element.AbstractPeak; 
import org.xmlcml.cml.element.AbstractPeakStructure; 
import org.xmlcml.cml.element.CMLPeak; 
import org.xmlcml.cml.element.CMLPeakStructure; 
import org.xmlcml.cml.element.CMLSpectrum; 
 
import spok.guicomponents.SpectrumChartFactory; 
import spok.guicomponents.SpokChartPanel; 
import net.bioclipse.specmol.listeners.SpecMolListener; 
 
/**
 * @author hel 
 * 
 */
 
public class SpecMolPeackChartComposite extends Composite implements SpecMolListener { 
 
 private SpokChartPanel chartPanel; 
 private AssignmentPage page; 
 private JFreeChart chart; 
 
 /**
  * Constructor 
  *  
  * @param parent 
  * @param style 
  * @param page 
  */
 
 public SpecMolPeackChartComposite(Composite parent, int style, AssignmentPage page) { 
  super(parent, style); 
  this.page = page; 
  init(page); 
 
 
 /**
  * initializes the composite by creating and adding a peak chart 
  * @param AssignmentPage page  
  */
 
 private void init(AssignmentPage page) { 
  GridLayout layout = new GridLayout(); 
  this.setLayout(layout); 
  GridData layoutData = new GridData(GridData.FILL_BOTH); 
  this.setLayoutData(layoutData); 
  Frame fileTableFrame = SWT_AWT.new_Frame(this); 
  fileTableFrame.setLayout(new BorderLayout()); 
  //create the chart and add it to the SWT_AWT frame 
  chart = SpectrumChartFactory.createPeakChart(null,nullnull); 
  chart.setTitle("empty chart"); 
  chartPanel = new SpokChartPanel(chart, "peak"null,null); 
  fileTableFrame.add(chartPanel, BorderLayout.CENTER); 
  chartPanel.addMouseListener(page.getPeakChartCompositeMouseListener());   
 
 
 /**
  * updates the charts underlying spectrum and repaints the chart with the new content 
  * @param CMLSpectrum spectrum 
  */
 
 public void updateSpectrum(CMLSpectrum spectrum) { 
  chartPanel.setSpectrum(spectrum); 
 
 
  
 /* (non-Javadoc)
  * @see bc_specmol.listener.SpecMolListener#selectionChanged(bc_specmol.editors.AssignmentController) 
  * get peakList form controller and highlight contained peaks in the peak chart by using a XYLineAnnotation 
  */
 
 public void selectionChanged(AssignmentController controller) { 
  ArrayList<CMLPeak> peaks = controller.getSelectedPeaks(); 
  XYPlot plot = chartPanel.getChart().getXYPlot(); 
  //first remove all existing old Annotations 
  List oldAnnos = plot.getAnnotations(); 
  Iterator it = oldAnnos.iterator(); 
  while (it.hasNext()) { 
   plot.removeAnnotation((XYAnnotation) it.next()); 
  
   
  //iterate over selected peaks and highlight them via adding a XYLineAnnotation 
  if (peaks != null && peaks.size() > 0) { 
   for (int i=0; i<peaks.size(); i++) { 
    CMLPeak peak = peaks.get(i); 
    double xval = peak.getXValue(); 
    double yval = peak.getYValue(); 
    //if peak has no y-value assigned set y value to upperBound of the chart 
    if (yval == 0 || Double.isNaN(yval)) { 
     yval = plot.getRangeAxis().getUpperBound(); 
    
    //create the XYKLineAnnotation and add it to the plot 
    XYLineAnnotation lineAnno = new XYLineAnnotation(xval, 0, xval, yval, new BasicStroke(1f), page.getHighlightColor()); 
    plot.addAnnotation(lineAnno); 
   
  
  // give peak details 
  if (peaks.size() == 1) { 
   AbstractPeak peak = (AbstractPeak)peaks.get(0); 
   String details = ""
   if (peak.getPeakMultiplicity() != null && peak.getPeakMultiplicity().length() > 0) { 
    details = "multiplicity: " + peak.getPeakMultiplicity(); 
   
   if (peak.getPeakStructureElements().size() > 0) { 
    details += " J-couplings: "
    Iterator<CMLPeakStructure> iter = peak.getPeakStructureElements().iterator(); 
    while (iter.hasNext()) { 
     String aps = ((AbstractPeakStructure)iter.next()).getCMLValue(); 
     if ( aps != null && aps.length() > 0
     details += ((AbstractPeakStructure)iter.next()).getCMLValue() + " ";  
    
   
   page.setPeakDetails(details); 
  
 
 
 /**
  * remove all annotations from the chart 
  */
 
 public void unselect() { 
  XYPlot plot = chartPanel.getChart().getXYPlot(); 
  List oldAnnos = plot.getAnnotations(); 
  Iterator it = oldAnnos.iterator(); 
  while (it.hasNext()) { 
   plot.removeAnnotation((XYAnnotation) it.next()); 
  }   
 
 
 /**
  * Method for retrieving the chartPanel containing the chart 
  * @return SpocChartPanel chartPanel 
  */
 
 public SpokChartPanel getChartPanel() { 
  return chartPanel; 
 
 
}