From 9dfaa0bccbb9b2b54b22a04b17c509912b507f82 Mon Sep 17 00:00:00 2001
From: tjc <tjc@ee4ac58c-ac51-4696-9907-e4b3aa274f04>
Date: Mon, 18 Aug 2008 10:36:00 +0000
Subject: [PATCH] draw graphs on linear plot

git-svn-id: svn+ssh://svn.internal.sanger.ac.uk/repos/svn/pathsoft/artemis/trunk@8567 ee4ac58c-ac51-4696-9907-e4b3aa274f04
---
 uk/ac/sanger/artemis/circular/Graph.java | 110 ++++++++++++++++++++---
 1 file changed, 96 insertions(+), 14 deletions(-)

diff --git a/uk/ac/sanger/artemis/circular/Graph.java b/uk/ac/sanger/artemis/circular/Graph.java
index e08521a6a..104821322 100644
--- a/uk/ac/sanger/artemis/circular/Graph.java
+++ b/uk/ac/sanger/artemis/circular/Graph.java
@@ -34,8 +34,6 @@ import java.awt.event.ActionListener;
 import java.awt.geom.AffineTransform;
 
 import javax.swing.*;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
 
 import uk.ac.sanger.artemis.sequence.Bases;
 
@@ -69,7 +67,10 @@ public abstract class Graph extends JPanel
   {
     super.paintComponent(g);
     Graphics2D g2  = (Graphics2D)g;
-    draw(g2);
+    if(getCurrentDna().isCircular())
+      draw(g2);
+    else
+      drawLinear(g2);
   }
   
   /**
@@ -163,6 +164,79 @@ public abstract class Graph extends JPanel
     }
     g2.setTransform(origin);
   }
+  
+  
+  public void drawLinear(Graphics2D g2)
+  {
+    RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
+        RenderingHints.VALUE_ANTIALIAS_ON); 
+    qualityHints.put(RenderingHints.KEY_RENDERING,               
+    RenderingHints.VALUE_RENDER_QUALITY); 
+    g2.setRenderingHints(qualityHints);
+
+    int basesPerLine = getCurrentDna().getBasesPerLine();
+    float lineHeight = getCurrentDna().getLineHeight();
+    float singleBaseWidth = getCurrentDna().getSingleBaseWidth();
+    int border2 = getCurrentDna().getBorder2();
+    
+    Bases bases = getBases();
+    
+    int nvalues = bases.getLength()/getBaseStepSize();
+    
+    if(value_array == null)
+    {
+      value_array = new float [nvalues];
+      gcAverage   = 0;
+      for(int i=0; i<nvalues; i++)
+      {
+        int start = (i*getBaseStepSize())+1;
+        int end = start+getWindowSize();
+        
+        if(end > bases.getLength())
+          end = bases.getLength();
+        
+        value_array[i] = calculateValue(start, end);
+        if(value_array[i] > maxValue)
+          maxValue = value_array[i];
+        if(value_array[i] < minValue)
+          minValue = value_array[i];
+        gcAverage += value_array[i];
+      }
+      gcAverage = gcAverage/nvalues;
+    }
+    
+    int minPos = (int)(lineHeight*(1-getTrack()));
+    int maxPos = minPos + (int)(lineHeight*getGraphHeight());
+    
+    BasicStroke basicstroke = new BasicStroke(
+        getStrokeSize(),
+        BasicStroke.CAP_BUTT, 
+        BasicStroke.JOIN_MITER);
+    g2.setStroke(basicstroke);
+    
+    int avVal = minPos - (int)( ((gcAverage-minValue)/(maxValue-minValue))*(maxPos-minPos) );
+    for(int i=0;i<nvalues-1; i++)
+    {
+      float xA = value_array[i];
+       
+      if(value_array[i] >= gcAverage)
+        g2.setColor(getPlusColour());
+      else
+        g2.setColor(getMinusColour());
+
+      int val = minPos - (int)( ((xA-minValue)/(maxValue-minValue))*(maxPos-minPos) );
+      
+      int basePos = (i*getBaseStepSize())+1;
+      int lineNumber = Math.round((float)(basePos-1)/((float)basesPerLine) + 0.5f)-1;
+      
+      int xpos = (int) ((basePos-(lineNumber*basesPerLine))*singleBaseWidth)+border2;
+      
+      int ypos = (int) ( (lineNumber*lineHeight) - (strokeSize/2.f) -
+          (getTrack()*lineHeight) + border2);
+      
+      g2.drawLine(xpos, avVal+ypos, xpos, val+ypos);
+    }
+  }
 
   protected int getWindowSize()
   {
@@ -298,16 +372,18 @@ public abstract class Graph extends JPanel
     
     c.gridx = 1;
     c.anchor = GridBagConstraints.WEST;
-    final JSlider slider = new JSlider(1,60,(int)(getGraphHeight()*100));
-    slider.addChangeListener(new ChangeListener()
+    //final JSlider slider = new JSlider(1,60,(int)(getGraphHeight()*100));
+    final TextFieldFloat graphHeightField = new TextFieldFloat();
+    graphHeightField.setValue(getGraphHeight());
+    graphHeightField.addActionListener(new ActionListener()
     {
-      public void stateChanged(ChangeEvent e)
+      public void actionPerformed(ActionEvent e)
       {
-        setGraphHeight(slider.getValue()/100.f);
+        setGraphHeight((float) graphHeightField.getValue());
         repaint();
       }
     });
-    optionBox.add(slider, c);
+    optionBox.add(graphHeightField, c);
     
     
     // WINDOW SIZE
@@ -362,16 +438,18 @@ public abstract class Graph extends JPanel
     
     c.gridx = 1;
     c.anchor = GridBagConstraints.WEST;
-    final JSlider trackSlider = new JSlider(1,10,(int)(getTrack()*10));
-    trackSlider.addChangeListener(new ChangeListener()
+    final TextFieldFloat trackField = new TextFieldFloat();
+    trackField.setValue(getTrack());
+    
+    trackField.addActionListener(new ActionListener()
     {
-      public void stateChanged(ChangeEvent e)
+      public void actionPerformed(ActionEvent e)
       {
-        setTrack(trackSlider.getValue()/10.f);
+        setTrack(trackField.getValue());
         repaint();
       }
     });
-    optionBox.add(trackSlider, c);
+    optionBox.add(trackField, c);
     
     // COLOUR
     final JButton button = new JButton();
@@ -421,6 +499,10 @@ public abstract class Graph extends JPanel
     JOptionPane.showMessageDialog(null, 
         optionBox, "Graph Options", 
         JOptionPane.PLAIN_MESSAGE);
+    
+    setGraphHeight((float) graphHeightField.getValue());
+    setTrack(trackField.getValue());
+    repaint();
   }
   
   private void setColorButton(final JButton button,
@@ -446,7 +528,7 @@ public abstract class Graph extends JPanel
     {
       public void actionPerformed(ActionEvent e)
       {
-        dialog.show();
+        dialog.setVisible(true);
       }
     });
   }
-- 
GitLab