Skip to content
Snippets Groups Projects
FeatureBaseViewer.java 5.27 KiB
Newer Older
  • Learn to ignore specific revisions
  • tjc's avatar
    tjc committed
    /* FeatureBaseViewer.java
     *
     * created: Sat Dec 19 1998
     *
     * This file is part of Artemis
     * 
     * Copyright (C) 1998,1999,2000  Genome Research Limited
     * 
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * as published by the Free Software Foundation; either version 2
     * of the License, or (at your option) any later version.
     * 
     * 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 General Public License for more details.
     * 
     * You should have received a copy of the GNU General Public License
     * along with this program; if not, write to the Free Software
     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     *
    
    tjc's avatar
    tjc committed
     * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/FeatureBaseViewer.java,v 1.2 2008-12-16 11:46:15 tjc Exp $
    
    tjc's avatar
    tjc committed
     */
    
    package uk.ac.sanger.artemis.components;
    
    
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    
    
    tjc's avatar
    tjc committed
    import uk.ac.sanger.artemis.*;
    
    /**
    
     *  A component for viewing the bases of a feature. Once created this
    
    tjc's avatar
    tjc committed
     *  component listens for FeatureChange events to keep the the sequence up to
     *  date.
     *  @author Kim Rutherford
     **/
    
    public class FeatureBaseViewer
    
    tjc's avatar
    tjc committed
        implements EntryChangeListener, FeatureChangeListener 
    {
      /** The Feature that this component is showing information about.   */
      private Feature feature = null;
    
      /** The SequenceViewer object that is displaying the feature bases. */
      private SequenceViewer sequence_viewer;
    
      /** The Entry that contains the Feature this object is displaying.  */
      private Entry entry;
      
    
      private FeatureSegmentVector segments;
      
    
    tjc's avatar
    tjc committed
      /**
       *  Create a new FeatureBaseViewer component to display the bases of the
       *  given Feature.
       *  @param feature The feature to view.
       *  @param include_numbers If true then the sequence will be numbered
       *    (every second line of the display will be numbers rather than
       *    sequence).
       **/
      public FeatureBaseViewer (final Feature feature,
    
                                final boolean include_numbers,
                                final FeatureSegmentVector segments) 
    
    tjc's avatar
    tjc committed
      {
    
    tjc's avatar
    tjc committed
        this.feature = feature;
        this.entry = feature.getEntry ();
    
        this.segments = segments;
    
    tjc's avatar
    tjc committed
    
        sequence_viewer =
          new SequenceViewer ("Feature base viewer for feature:" +
    
    tjc's avatar
    tjc committed
                              getFeature ().getIDString (), include_numbers);  
    
    tjc's avatar
    tjc committed
        redisplay ();
        getFeature ().getEntry ().addEntryChangeListener (this);
        getFeature ().addFeatureChangeListener (this);
    
    tjc's avatar
    tjc committed
        sequence_viewer.addWindowListener (new WindowAdapter () 
        {
          public void windowClosed (WindowEvent event)
          {
    
    tjc's avatar
    tjc committed
            stopListening ();
          }
        });
      }
      
      /**
       *  Remove this object as a entry and feature change listener.
       **/
    
    tjc's avatar
    tjc committed
      private void stopListening () 
      {
    
    tjc's avatar
    tjc committed
        getEntry ().removeEntryChangeListener (this);
        getFeature ().removeFeatureChangeListener (this);
      }
      
      /**
       *  Implementation of the EntryChangeListener interface.  We listen to
       *  EntryChange events so we can delete this component if the feature gets
       *  deleted.
       **/
    
    tjc's avatar
    tjc committed
      public void entryChanged (EntryChangeEvent event) 
      {
        switch (event.getType ()) 
        {
    
    tjc's avatar
    tjc committed
        case EntryChangeEvent.FEATURE_DELETED:
    
    tjc's avatar
    tjc committed
          if (event.getFeature () == getFeature ()) 
          {
    
    tjc's avatar
    tjc committed
            stopListening ();
            sequence_viewer.dispose ();
          }
          break;
        default:
          // do nothing;
          break;
        }
      }
    
      /**
       *  Implementation of the FeatureChangeListener interface.  We need to
       *  listen to feature change events from the Features in this object so that
       *  we can keep the display up to date.
       *  @param event The change event.
       **/
    
    tjc's avatar
    tjc committed
      public void featureChanged (FeatureChangeEvent event) 
      {
    
    tjc's avatar
    tjc committed
        // re-read the information from the feature
        redisplay ();
      }
    
      /**
       *  Redisplay the bases.
       **/
    
    tjc's avatar
    tjc committed
      private void redisplay () 
      {
        final String product = getFeature().getProductString();
    
        final StringBuilder hdr = new StringBuilder();
        hdr.append(getFeature().getSystematicName()).append(" ");
        hdr.append(getFeature().getIDString()).append(" ");
        hdr.append(product == null ? "undefined product" : product);
    
    tjc's avatar
    tjc committed
        
    
        final String bases;
        if(segments != null)  // display just for selected segments
        {
          final StringBuilder buffer = new StringBuilder();
          segments.sortByPosition();
          for(int i = 0; i < segments.size(); ++i) 
          {
            final FeatureSegment segment = segments.elementAt(i);
            buffer.append(segment.getBases());
            hdr.append(i == 0 ? " " : ",").append(segment.getRawRange().toString());
          }
          hdr.append(getFeature ().isForwardFeature() ? " forward" : " reverse");
          bases = buffer.toString();
        }
        else
        {
          hdr.append(" ").append(getFeature().getWriteRange());
          bases = getFeature ().getBases ();
        }
    
        sequence_viewer.setSequence (">" + hdr.toString(), bases.toUpperCase ());
    
    tjc's avatar
    tjc committed
      }
    
      /**
       *  Return the feature this component is showing information about.
       **/
    
    tjc's avatar
    tjc committed
      private Feature getFeature () 
      {
    
    tjc's avatar
    tjc committed
        return feature;
      }
    
      /**
       *  Return the Entry that contains the Feature this object is displaying.
       **/
    
    tjc's avatar
    tjc committed
      private Entry getEntry () 
      {
    
    tjc's avatar
    tjc committed
        return entry;
      }
    }