Package edu.stanford.genetics.treeview.plugin.karyoview

Source Code of edu.stanford.genetics.treeview.plugin.karyoview.KaryoView

/* BEGIN_HEADER                                              Java TreeView
*
* $Author: alokito $
* $RCSfile: KaryoView.java,v $
* $Revision: 1.3 $
* $Date: 2008-03-09 21:06:34 $
* $Name:  $
*
* This file is part of Java TreeView
* Copyright (C) 2001-2003 Alok Saldanha, All Rights Reserved. Modified by Alex Segal 2004/08/13. Modifications Copyright (C) Lawrence Berkeley Lab.
*
* This software is provided under the GNU GPL Version 2. In particular,
*
* 1) If you modify a source file, make a comment in it containing your name and the date.
* 2) If you distribute a modified version, you must do it under the GPL 2.
* 3) Developers are encouraged but not required to notify the Java TreeView maintainers at alok@genome.stanford.edu when they make a useful addition. It would be nice if significant contributions could be merged into the main distribution.
*
* A full copy of the license can be found in gpl.txt or online at
* http://www.gnu.org/licenses/gpl.txt
*
* END_HEADER
*/
package edu.stanford.genetics.treeview.plugin.karyoview;

import java.awt.*;
import java.awt.event.*;
import java.util.Observable;
import java.util.Observer;

import javax.swing.*;

import edu.stanford.genetics.treeview.*;
import edu.stanford.genetics.treeview.SwingWorker;


/**
* This class is a model view that displays the karyoscope view for a
* single experiment in the dataset.
*
* There is really quite a lot of complexity involved. I have decided to factor
* out all knowledge of where things are positioned into the KaryoDrawer class.
*
* I have retained knowledge of averaging in this class, as well as most of the
* component mechanics. This is to facilitate the use of KaryoDrawer for drawing
* to images with configurable parameters.
*/

public class KaryoView extends ModelView implements Observer {
   
  private KaryoViewParameterPanel parameterPanel = null;
  public KaryoViewParameterPanel getParameterPanel(){return parameterPanel;}
  public void setParameterPanel(KaryoViewParameterPanel p) { parameterPanel = p;}
 
    /**
     * current experiment column to view
     */
    private int currentCol = 0;
    public int getCurrentCol() { return currentCol;}
    public void setCurrentCol(int n) {
    if (currentCol == n) return;
    currentCol = n;
    recalculateAverages();
    offscreenValid = false;
  }

  private KaryoDrawer karyoDrawer = null;
  /** Setter for karyoDrawer */
  public void setKaryoDrawer(KaryoDrawer karyoDrawer) {
    if (this.karyoDrawer != null) {
      this.karyoDrawer.deleteObserver(this);
    }
    this.karyoDrawer = karyoDrawer;
    if (this.karyoDrawer != null) {
      this.karyoDrawer.addObserver(this);
    }
  }
  /** Getter for karyoDrawer */
  public KaryoDrawer getKaryoDrawer() {
    return karyoDrawer;
  }
 
  /* averaging accessors */
  private AveragerSettingsPanel averagerSettingsPanel;
  public SettingsPanel getAveragerSettingsPanel() {
    return averagerSettingsPanel;
  }
  public int getAveragingType() {
    return averager.getType();
  }
  public String getAveragingArg() {
    return averager.getArg();
  }
  private int defaultAverager = Averager.INTERVAL;
  public void setSimpleAveraging() {
    averagerSettingsPanel.setEnabled(false);
    configNode.setAttribute("averager", simpleAverager.getType(), defaultAverager);
    recalculateAverages();
  }
  public void setNearestAveraging(int num) {
    averagerSettingsPanel.setEnabled(false);
    configNode.setAttribute("averager", nearestAverager.getType(), defaultAverager);
     nearestAverager.setNum(num);
     recalculateAverages();
  }
  public void setNeighborAveraging(int num) {
    averagerSettingsPanel.setEnabled(false);
    configNode.setAttribute("averager", neighborAverager.getType(), defaultAverager);
     neighborAverager.setNum(num);
     recalculateAverages();
  }
  public void setIntervalAveraging(double width) {
    averagerSettingsPanel.setEnabled(false);
    configNode.setAttribute("averager", intervalAverager.getType(), defaultAverager);
     intervalAverager.setWidth(width);
     recalculateAverages();
  }
 
  private Averager getAverager(int type) {
    switch(type) {
      case Averager.SIMPLE:
        return simpleAverager;
      case Averager.NEAREST:
        return nearestAverager;
      case Averager.NEIGHBOR:
        return neighborAverager;
      case Averager.INTERVAL:
        return intervalAverager;
    }
    return getAverager(defaultAverager);
  }
 
    /* Some private state variables... */
  private Averager         simpleAverager;
  private NeighborAverager neighborAverager;
  private NearestAverager  nearestAverager;
  private IntervalAverager intervalAverager;
  private JScrollPane scrollPane;
  private DataMatrix dataMatrix;
  /** Setter for dataMatrix */
  public void setDataMatrix(DataMatrix dataMatrix) {
    this.dataMatrix = dataMatrix;
  }
  /** Getter for dataMatrix */
  public DataMatrix getDataMatrix() {
    return dataMatrix;
  }
  /** Getter for numCol */
  public int getNumCol() {
    return dataMatrix.getNumCol();
  }
  private double nodata;
  /** Setter for nodata */
  public void setNodata(double nodata) {
    this.nodata = nodata;
  }
  /** Getter for nodata */
  public double getNodata() {
    return nodata;
  }
private HeaderInfo experimentInfo;
  private HeaderInfo geneInfo;
  /** Setter for geneInfo */
  public void setGeneInfo(HeaderInfo geneInfo) {
    this.geneInfo = geneInfo;
  }
  /** Getter for geneInfo */
  public HeaderInfo getGeneInfo() {
    return geneInfo;
  }

  /**
  * removes any pointers to exteral objects to aid GC
  */
  public void cleanup() {
    dataMatrix = null;
    scrollPane = null;
    karyoDrawer = null;
    experimentInfo = null;
    geneInfo = null;
  }
 
  public void update(Observable o, Object arg) {
    if (o == karyoDrawer) {
      offscreenValid = false;
      revalidate();
      repaint();
    } else {
      LogBuffer.println("KaryoView got weird update from " + o);
    }
  }
 
    /**
     * for viewing DataModels
     */
  public KaryoView(KaryoDrawer karyoDrawer, DataModel tvmodel) {
    setKaryoDrawer(karyoDrawer);
    dataMatrix = tvmodel.getDataMatrix();
    nodata = DataModel.NODATA;
    experimentInfo = tvmodel.getArrayHeaderInfo();
    geneInfo = tvmodel.getGeneHeaderInfo();
   
    simpleAverager = new Averager();
    simpleAverager.setKaryoView(this);
    nearestAverager = new NearestAverager();
    nearestAverager.setKaryoView(this);
    neighborAverager = new NeighborAverager();
    neighborAverager.setKaryoView(this);
    intervalAverager = new IntervalAverager();
    intervalAverager.setKaryoView(this);
    averagerSettingsPanel = new AveragerSettingsPanel(this);
    averager = simpleAverager;
    averageTimer = new javax.swing.Timer(1000, new TimerListener());
    averageTimer.stop();
    mouseTracker = new MouseTracker();
    statusText[1] = "Mouse over for info on genes...";
    statusText[2] = "";
    statusText[3] = "";
    scrollPane = new JScrollPane(this);
    panel = scrollPane;
    addMouseMotionListener(mouseTracker);
    addMouseListener(mouseTracker);
    addKeyListener(mouseTracker);
  }
  ProgressMonitor averagerMonitor;
  javax.swing.Timer averageTimer;
  AveragerTask averagerTask;
  class TimerListener implements ActionListener { // manages the averagermonitor
    public void actionPerformed(ActionEvent evt) {
      if (averagerMonitor.isCanceled() || averagerTask.done()) {
        averagerMonitor.close();
        averagerTask.stop();
        // Toolkit.getDefaultToolkit().beep();
        averagerSettingsPanel.setEnabled(true);
        averageTimer.stop();
        if (averagerTask.done()) {
          averagerMonitor.setNote("Averaging complete");
        }
      } else {
        averagerMonitor.setNote(averagerTask.getMessage());
        averagerMonitor.setProgress(averagerTask.getCurrent());
      }
      repaint();
    }
  }
  class AveragerTask {
    private int current = 0;
    private String statMessage;
   
   
    /**
    * Called to start the task. I don't know why we bother with the ActualTask class, so don't ask.
    */
    void go() {
      setCurrent(0);
      final SwingWorker worker = new SwingWorker() {
        public Object construct() {
          return new ActualTask();
        }
      };
      worker.start();
    }
   
   
    /**
    * Called from ProgressBarDemo to find out how much work needs
    * to be done.
    */
    int getLengthOfTask() {
      return karyoDrawer.getGenome().getNumLoci();
    }
   
    /**
    * Called from ProgressBarDemo to find out how much has been done.
    */
    int getCurrent() {
      return current;
    }
    void setCurrent(int i) {
      current = i;
    }
    public void incrCurrent() {
      current++;
    }
    /**
    * called to stop the averaging on a cancel...
    */
    void stop() {
      current = getLengthOfTask();
    }
   
   
    /**
    * Called from ProgressBarDemo to find out if the task has completed.
    */
    boolean done() {
      if (current >= getLengthOfTask()) {
        return true;
      } else {
        return false;
      }
    }
   
    String getMessage() {
      return statMessage;
    }
    class ActualTask {
      ActualTask() {
        karyoDrawer.setNodata(nodata);
        Genome genome = karyoDrawer.getGenome();
        int nchr = genome.getMaxChromosome();
        setCurrent(0);
//        System.out.println("Actual task started, length " + getLengthOfTask());
        for (int i = 1; i <= nchr; i++) {
          statMessage = "Processing Chromosome " + i;
          ChromosomeLocus start = genome.getChromosome(i).getLeftEnd();
          if (start == null) { // nothing on chromosome...
            continue;
          }
          ChromosomeLocus current = start;
          int currentCol = getCurrentCol();
          double nodata = getNodata();
          do  {
            if (done()) break;
            if (current.getCdtIndex() != -1) {
              try {
                karyoDrawer.setMapValue(current, averager.getValue(current, currentCol));
              } catch (java.lang.ArrayIndexOutOfBoundsException e) {
                karyoDrawer.setMapValue(current, nodata);
              }
            } else {
              karyoDrawer.setMapValue(current, nodata);
            }
            current = current.getRight();
           
            incrCurrent();
          } while ((current != start) && (current != null));
          if (done()) break;
        }
        stop();
      }
    }
  }
  public void recalculateAverages() {
    averager = getAverager(configNode.getAttribute("averager", defaultAverager));
    // only need to calculate averages for loci which are in genome...
    averagerTask = new AveragerTask();
    averagerMonitor = new ProgressMonitor(this,
    "Calculating Averaged Values",
    "Note", 0, averagerTask.getLengthOfTask());
    averagerMonitor.setProgress(0);
    averagerTask.go();
    averageTimer.start();
  }

  Averager averager = null;
  MouseTracker mouseTracker = new MouseTracker();
  public synchronized void paintComposite (Graphics g) {
    mouseTracker.paintComposite(g);
  }
 
  /**
  * override parent so as to avoid running out of memory at high zooms.
  */
  public void paintComponent(Graphics g) {
    Dimension newsize = getSize();
    if (newsize == null) { return;}
    //    karyoDrawer.notifyObservers();
    if (karyoDrawer.getPixelPerVal() == 0) {
      if (getKaryoDrawer().getGenome().getMaxChromosome() > 0) {
        if (getKaryoDrawer().getGenome().getNonemptyCount() > 0) {
          redoScale();
        } else {
          return;
        }
      }
    }
//    System.out.println("repaint called on KaryoView " + newsize);
    // update offscreenBuffer if necessary
    g.setColor(Color.white);
    g.fillRect(0,0,newsize.width, newsize.height);
    if (isEnabled()) {
      offscreenValid = false;
      updateBuffer(g);
      paintComposite(g);
    }
  }
  Rectangle clipRect = new Rectangle();
  public void updateBuffer(Graphics g) {
    if (justZoomed) {
    justZoomed = false;
    scrollPane.getViewport().setViewPosition(zoomPoint);
    repaint();
    return;
    }
    try {
      clipRect = g.getClipBounds(clipRect);
    } catch (java.lang.NoSuchMethodError e) {
      clipRect.setBounds(g.getClipBounds());
    }
    karyoDrawer.paint(g, clipRect);
  }
 
 
  /*
  private int nChromosomes = 0;
  private int chrIndex = -1;
  private int armIndex = -1;
  private int posIndex = -1;
  private int orfIndex = -1;
  */
    public String viewName() {
  return "KaryoView";
    }

  /**
  * This method is called to make the karyoview fit on the screen.
  * It will set the desired width and height, and then ask the KaryoDrawer
  * to adjust the pixels per value and pixels per row to something sensible.
  */
  Rectangle repaintRect = new Rectangle();
  public void redoScale() {
//    Exception e = new Exception();    e.printStackTrace();
    Dimension size = scrollPane.getViewport().getExtentSize();
    karyoDrawer.setWidth(size.width);
    karyoDrawer.setHeight(size.height);
    karyoDrawer.autoScale();
   
    revalidate();
    repaintRect.setBounds(0, 0, size.width, size.height);
    repaint(repaintRect);

    if (parameterPanel != null) {
      parameterPanel.getValues();
    }
  }
    public String [] getExperiments() {
    String [] names = new String[getNumCol()];
    for (int i = 0; i < getNumCol();i++) {
    names[i] = experimentInfo.getHeader(i)[0];
    }
    return names;
  }
    public Dimension getPreferredSize() {
  if (karyoDrawer.getWidth() >= 0) {
      Dimension p = new Dimension(karyoDrawer.getWidth(),karyoDrawer.getHeight());
      return p;
  } else {
      return super.getPreferredSize();
  }
    }

  public boolean isChromosomeVisible(int i) {
    JViewport viewport = scrollPane.getViewport();
    Rectangle clipRect = viewport.getViewRect();
    int min = karyoDrawer.minVisibleChromosome(clipRect);
    int max = karyoDrawer.maxVisibleChromosome(clipRect);
    System.out.println("min " + min + " max " + max);
    if (i <= max && i >= min) {
      return true;
    } else {
      return false;
    }
  }
 
  private boolean justZoomed = false;
  private Point zoomPoint = new Point();
  private void zoomRectangle(Rectangle r) {
    JViewport viewport = scrollPane.getViewport();
    Dimension visible = viewport.getExtentSize();
    // calculate scale factors...
    double sx = (double) visible.width / r.width;
    double sy = (double) visible.height / r.height;

    /*
    Dimension scrollPaneSize = scrollPane.getSize();
    Dimension viewportSize = viewport.getSize();
    Dimension viewSize = viewport.getViewSize();
    System.out.println("scrollPaneSize " + scrollPaneSize);
    System.out.println("viewPort " + viewport);
    System.out.println("viewportSize " + viewportSize);
    System.out.println("extentSize " + visible);
    System.out.println("viewSize " + viewSize);
    System.out.println("zoomto " + r);
    */
//    System.out.println("was " + getPreferredSize());
    karyoDrawer.setWidth((int) (karyoDrawer.getWidth()  * sx));
    karyoDrawer.setHeight((int) (karyoDrawer.getHeight() * sy));
    karyoDrawer.setPixelPerMap(sx * karyoDrawer.getPixelPerMap());
    karyoDrawer.setPixelPerVal(sy * karyoDrawer.getPixelPerVal());
//    System.out.println("now " + getPreferredSize());
    revalidate();
    zoomPoint.setLocation((int) (sx * r.x),
                (int) (sy * r.y));
    justZoomed = true;
    scrollPane.repaint();
    if (parameterPanel != null) {
      parameterPanel.getValues();
    }
  }
  /**
  * Zoom with the specified factor, keeping the specified point in the same relative place.
  *
  * If the point is null, it keeps the center in the same place.
  */
  private void zoomFactor(double factor, Point point) {
    JViewport viewport = scrollPane.getViewport();
    Dimension visible = viewport.getExtentSize();
    Point r = viewport.getViewPosition();
    if (point == null) {
      point = new Point(r.x + visible.width/2, r.y + visible.height/2);
    }
    // zooms view out...
    karyoDrawer.setWidth((int) (karyoDrawer.getWidth()      * factor));
    karyoDrawer.setHeight((int) (karyoDrawer.getHeight()    * factor));
    karyoDrawer.setPixelPerMap(karyoDrawer.getPixelPerMap() * factor);
    karyoDrawer.setPixelPerVal(karyoDrawer.getPixelPerVal() * factor);
    revalidate();
    zoomPoint.setLocation((int) (point.x*factor - (point.x - r.x)),
              (int) (point.y*factor - (point.y - r.y)));
    justZoomed = true;
    scrollPane.repaint();
    if (parameterPanel != null) {
      parameterPanel.getValues();
    }
  }
  /**
  * follows mouse around, communicates with KaryoView by calling drawBad
  * and being called by paintComposite()
  */
  class MouseTracker implements MouseMotionListener, MouseListener, KeyListener {
    /* key listener */
    public void keyPressed (KeyEvent e) {
        // Invoked when a key has been pressed.
    }
    public void keyReleased (KeyEvent e) {
        //��Invoked when a key has been released.
    }
    public void keyTyped (KeyEvent e) {
        //  Invoked when a key has been typed.
      switch (e.getKeyChar()) {
        case '-':
          zoomFactor(0.5, startPoint);
          startPoint.x = (int)(startPoint.x * 0.5);
          startPoint.y = (int)(startPoint.y * 0.5);
          mouseMoved(new MouseEvent (KaryoView.this, MouseEvent.MOUSE_MOVED, 10, 0,
          startPoint.x, startPoint.y, 1, false));
          break;
        case '+':
          zoomFactor(2.0, startPoint);
          startPoint.x = (int)(startPoint.x * 2.0);
          startPoint.y = (int)(startPoint.y * 2.0);
          mouseMoved(new MouseEvent (KaryoView.this, MouseEvent.MOUSE_MOVED, 10, 0,
          startPoint.x, startPoint.y, 1, false));
          break;
      }
    }

    Point startPoint = new Point();
    Point endPoint = new Point();
    /* dragRect is non-null when the mouse is dragging */
    Rectangle dragRect = null;

    /*
     * tip and highlight are non-null when the mouse is in the view
     * they are also set to null when the mouse is released on a zoom
     */
    Point tip = null;           // keeps track of the tip of the  most recent gene
    Rectangle highlight = null; // box around tip in which to draw highlight

    Rectangle repaintRect = new Rectangle();
    public void mouseEntered(MouseEvent e) {
      requestFocus();
    }
   
    public void mouseExited(MouseEvent e) {
    repaint(repaintRect);
    if (tip != null) {
      repaintRect.setLocation(tip.x, tip.y);
    }
    repaintRect.setSize(0,0);
    if (highlight != null) {
      repaintRect.add(highlight);
    }
    tip       = null;
    highlight = null;
    repaint(repaintRect);
    updateStatus(null);
    }

    public void mouseClicked(MouseEvent e) {
      if (viewFrame.windowActive() == false) return;
    int xpos = (int) e.getX();
    int ypos = (int) e.getY();
    startPoint.setLocation(xpos, ypos);
    ChromosomeLocus closest = karyoDrawer.getClosest(startPoint);
    if (closest != null) {
      int closestIndex = closest.getCdtIndex();
      if (closestIndex != -1) {
        if (viewFrame != null) {
          viewFrame.displayURL(closestIndex);
        }
      }
     
    }
    }   
   
    // MouseMotionListener
    public void mouseMoved(MouseEvent e) {
    int xpos = e.getX();
    int ypos = e.getY();
    startPoint.setLocation(xpos, ypos);
    ChromosomeLocus closest = karyoDrawer.getClosest(startPoint);
    updateStatus(closest);
    moveHighlight(closest);
    }
    // Mouse Listener
    public void mousePressed(MouseEvent e) {
      mouseExited(e);
    if (viewFrame.windowActive() == false) return;
    // initialize startpoint and endpoint
    startPoint.setLocation(e.getX(), e.getY());
    endPoint.setLocation(startPoint.x, startPoint.y);
    // setup dragrect
    dragRect = new Rectangle();
    dragRect.setLocation(startPoint.x, startPoint.y);
    dragRect.setSize(endPoint.x - dragRect.x, endPoint.y - dragRect.y);
    // repaint.
    repaint(dragRect);
    }
    public void mouseReleased(MouseEvent e) {
    if (viewFrame.windowActive() == false) return;
    if (dragRect == null) return;
    mouseDragged(e);
    repaintRect.setBounds(dragRect);
    // need to set null for repaint....
    tip = null;
    highlight = null;
    dragRect = null;
//    System.out.println("Repainting rect");
    repaint(repaintRect);
    if (repaintRect.width > 3) {
      if (repaintRect.height > 3) {
      zoomRectangle(repaintRect);
      }
    }
    }
    // MouseMotionListener
    public void mouseDragged(MouseEvent e) {
    // move dragRect
   
    if (dragRect == null) {
      LogBuffer.println("dragRect null");
      return;
    }
    endPoint.setLocation(e.getX(), e.getY());
    dragRect.setLocation(startPoint.x, startPoint.y);
    dragRect.setSize(0,0);
    dragRect.add(endPoint.x, endPoint.y);

    // animate!
    repaint(repaintRect)
    repaintRect.setBounds(dragRect);
    repaintRect.grow(1,1);
    repaint(repaintRect);
    }
   
    public void paintComposite (Graphics g) {
    // composite the rectangles...
    if (highlight != null) {
      g.setColor(karyoDrawer.getKaryoColorSet().getColor("Highlight"));
      int lx = highlight.x;
      int  ux = lx + highlight.width;
      int uy = highlight.y;
      int  ly = uy + highlight.height;
      g.drawLine(lx,ly,ux,uy);
      g.drawLine(lx,uy,ux,ly);
      //        g.fillRect(highlight.x, highlight.y,
      //               highlight.width, highlight.height);
    }
    if (tip != null) {
      int mouseX = (int) startPoint.x;
      int mouseY = (int) startPoint.y;
      g.drawLine(mouseX, mouseY, tip.x, tip.y);
    }
    if (dragRect != null) {
      drawBand(dragRect, g);
    }
    }
    private void drawBand(Rectangle l, Graphics g) {
      g.setColor(Color.yellow);
//      g.setXORMode(getBackground()); doesn't work. don't know why not - probbaly not using setBackground()???
    g.drawRect(l.x, l.y, l.width, l.height);
    g.setPaintMode();
    }

    private void removeHighlight() { // don't you love english?
      highlight = null;
      tip = null;
      repaint(repaintRect);
      return;
    }
    private void moveHighlight(ChromosomeLocus locus) {
      if (locus == null) {
        removeHighlight();
        return;
      }
     
      double val = 0;
      try {
        val = averager.getValue(locus, getCurrentCol());
      } catch (Exception e) {
        removeHighlight();
        return;
      }
     
      if (val == nodata) {
        removeHighlight();
        return;
      }
     
      // locate pixel of top of gene...
      tip = karyoDrawer.getEnd(locus);
     
      if (highlight == null) {
        highlight = new Rectangle();
      }
      highlight.setBounds(tip.x-5, tip.y-5, 11, 11);
      //     System.out.println("moved highlight to " + geneX + ", " + geneY + " locus " + locus.toString());
      repaint(repaintRect);
      repaintRect.setLocation(tip.x, tip.y);
      repaintRect.setSize(0,0);
      repaintRect.add(highlight);
      repaintRect.add(tip);
      repaintRect.add(startPoint);
      repaintRect.grow(1,1);
      repaint(repaintRect);
    }
  }
  private void updateStatus(ChromosomeLocus locus) {
    if (locus == null) {
      statusText[0] = "KeyBoard Shortcuts:";
      statusText[1] = "";
      statusText[2] = "'+' zooms in on mouse";
      statusText[3] = "'-' zooms out on mouse";
      statusText[4] = "";
      //      LogPanel.println("KaryoView.updateStatus(): Locus was " + locus);
    } else {
      int chr = locus.getChromosome();
      int arm = locus.getArm();
      double pos = locus.getPosition();
      int closestIndex = locus.getCdtIndex();
      statusText[0] = "Cursor is over Chromosome " + chr + " arm " + arm + " position " + pos;
      if (closestIndex != -1) {
        statusText[1] = geneInfo.getHeader(closestIndex,"NAME");
        double val = karyoDrawer.getMapValue(closestIndex);
        if (val == nodata) {
          statusText[2] = "Value: No Data";
        } else {
          statusText[2] = "Value: " + val;
        }
        String [] desc = averager.getDescription(locus, getCurrentCol());
        statusText[3] = desc[0];
        statusText[4] = desc[1];
      } else {
        statusText[1] = "Mouse over for info on genes...";
        statusText[2] = "";
        statusText[3] = "";
        statusText[4] = "";
      }
    }
    if (status != null) {
      status.setMessages(getStatus())
    }
  }
    private String [] statusText = new String[5];
    // method from ModelView
    public String[]  getStatus() {
  return statusText;
    }


    private ConfigNode configNode = new DummyConfigNode("KaryoView");
    /** Setter for configNode */
    public void bindConfig(ConfigNode configNode) {
      this.configNode = configNode;
      simpleAverager.bindConfiggetFirst("SimpleAverager"));
      intervalAverager.bindConfig(getFirst("IntervalAverager"));
      nearestAverager.bindConfig( getFirst("NearestAverager"));
      neighborAverager.bindConfig( getFirst("NeighborAverager"));
    }
    /** Getter for configNode */
    public ConfigNode getConfigNode() {
      return configNode;
    }

      /**
  * always returns an instance of the node, even if it has to create it.
  */
  private ConfigNode getFirst(String name) {
    ConfigNode cand = getConfigNode().fetchFirst(name);
    return (cand == null)? getConfigNode().create(name) : cand;
  }

  /**
  * Inner class to manage the settings of the extant averagers.
  */
  private class AveragerSettingsPanel extends JPanel implements SettingsPanel {
    private KaryoView karyoView;
    /** Setter for karyoView */
    public void setKaryoView(KaryoView karyoView) {
      this.karyoView = karyoView;
    }
    /** Getter for karyoView */
    @SuppressWarnings("unused")
  public KaryoView getKaryoView() {
      return karyoView;
    }
   
    public void setEnabled(boolean enabled) {
      simpleButton.setEnabled(enabled);
      nearestButton.setEnabled(enabled);
      neighborButton.setEnabled(enabled);
      intervalButton.setEnabled(enabled);
     
      nearestField.setEnabled(enabled);
      neighborField.setEnabled(enabled);
      intervalField.setEnabled(enabled);
    }
   
    private JButton simpleButton, nearestButton, neighborButton, intervalButton;
    private JTextField nearestField, neighborField, intervalField;
    public AveragerSettingsPanel(KaryoView karyoView) {
      setKaryoView(karyoView);
      configureWidgets();
      addWidgets();
    }
    private void addWidgets() {
      setLayout(new GridBagLayout());
      GridBagConstraints gc = new GridBagConstraints();
      gc.weightx = 100;
      gc.weighty = 100;
      gc.gridx = 0;
      gc.gridy = 0;
      gc.gridwidth = 1;
      gc.gridheight = 1;
      add(new JLabel("Options"));
      gc.gridy = 1;
      add(simpleButton, gc);

      gc.gridy = 2;
      add(nearestButton, gc);
      gc.gridy = 3;
      add(neighborButton, gc);
      gc.gridy = 4;
      add(intervalButton, gc);

      gc.gridx = 1;
      gc.gridy = 0;
      add(new JLabel("Options"));
      gc.gridy = 2;
      add(nearestField, gc);
      gc.gridy = 3;
      add(neighborField, gc);
      gc.gridy = 4;
      add(intervalField, gc);
    }
    private void configureWidgets() {
      // fields to enter data in
      nearestField = new JTextField("" + nearestAverager.getNum());
      neighborField = new JTextField("" + neighborAverager.getNum());
      intervalField = new JTextField("" + intervalAverager.getWidth());
      nearestField.setColumns(5);
      neighborField.setColumns(5);
      intervalField.setColumns(5);
      // buttons to choose from...
     
      //      type = new ButtonGroup();
      simpleButton = new JButton("No Averaging");
      simpleButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          karyoView.setSimpleAveraging();
        }
      });
     
      //      type.add(simpleButton);
     
      nearestButton = new JButton("Nearest :");
      nearestButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          karyoView.setNearestAveraging(Integer.parseInt(nearestField.getText()));
        }
      });
     
      neighborButton = new JButton("Neighbor :");
      neighborButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          karyoView.setNeighborAveraging(Integer.parseInt(neighborField.getText()));
        }
      });

      intervalButton = new JButton("Interval :");
      intervalButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          Double width = new Double(intervalField.getText());
          karyoView.setIntervalAveraging(width.doubleValue());
        }
      });
    }
   
    public void synchronizeTo() {
     
    }
   
    public void synchronizeFrom() {
    }
  }
 
 
}

/**
* just for parsing chromosome info...
*/
class KaryoParseException extends Exception {
    public KaryoParseException(String m) {
  super(m);
    }
}
TOP

Related Classes of edu.stanford.genetics.treeview.plugin.karyoview.KaryoView

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.