wiki:UTGBCore/CreateYourOwnTrack

wiki:Devel/Index

How to create your own track

  • Your track codes must be placed in gwt client folder (e.g., org.utgenome.gwt.utgb.client.track.lib)
  • An example track:
    /**
     * A simple wrapper for old UTGB tracks
     * 
     * @author leo
     *
     */
    public class LegacyTrack extends TrackBase
    {
        private DockPanel _panel = new DockPanel();
        private Image trackImage = new Image();
        private LegacyTrackInfo _legacyTrackInfo;
        private TrackConfig _config = new TrackConfig(this);
        private int offset = 0;
    
        public static TrackFactory factory()
        {
            return new TrackFactory(){
                public Track newInstance()
                {
                    return new LegacyTrack();
                }
            };
        }
        
        public LegacyTrack()
        {
            this(new LegacyTrackInfo());
        }
        
        public LegacyTrack(LegacyTrackInfo trackInfo)
        {
            super(trackInfo.getName());
            this._legacyTrackInfo = trackInfo;
            _panel.add(trackImage, DockPanel.CENTER);
        }
    
        public int getDefaultWindowHeight()
        {
            return 100;
        }
    
    
        public Widget getWidget()
        {
            return _panel;
        }
    
        public void onChangeTrackWindow(TrackWindow newWindow)
        {
            _legacyTrackInfo.setStart(newWindow.getStartOnGenome());
            _legacyTrackInfo.setEnd(newWindow.getEndOnGenome());
            
            draw();
        }
    
        public void draw()
        {
            int windowSize = getTrackGroup().getTrackWindow().getWindowWidth();
            _legacyTrackInfo.setWidth(windowSize);
    
            String imageUrl = _legacyTrackInfo.getImageURL(offset);
            trackImage.setUrl(imageUrl);
        }
    
    
        public void onChangeTrackGroupProperty(TrackGroupPropertyChange change)
        {
            String[] relatedProperty = {"species", "revision", "target"};
            
            if(!change.containsOneOf(relatedProperty))
                return; // no related change
            
            String species = change.getProperty("species", _legacyTrackInfo.getSpecies());
            String revision = change.getProperty("revision", _legacyTrackInfo.getRevision());
            String target = change.getProperty("target", _legacyTrackInfo.getTarget());
            
            _legacyTrackInfo.setSpecies(species);
            _legacyTrackInfo.setRevision(revision);
            _legacyTrackInfo.setTarget(target);
            
            // sync with the configuration panel
            _config.setParameter("species", species);
            _config.setParameter("revision", revision);
            _config.setParameter("target", target);
            
            draw();
        }
    
        public void setUp(TrackFrame trackFrame, TrackGroup group)
        {
            trackFrame.pack();
    
            TrackWindow w = group.getTrackWindow();
            _legacyTrackInfo.setStart(w.getStartOnGenome());
            _legacyTrackInfo.setEnd(w.getEndOnGenome());
            
            trackImage.addLoadListener(new LoadListener() {
                public void onError(Widget sender)
                {
                	trackImage.setUrl(Design.IMAGE_NOT_AVAILABLE);
                }
    
                public void onLoad(Widget sender)
                {
                    getFrame().onUpdateTrackWidget();
                }}
            );
            
            // set up the configuration panel
            _config.addConfigParameter("Track Name", new StringType("name"), _legacyTrackInfo.getName()); 
            _config.addConfigParameter("Track Image URL", new StringType("baseURL"), _legacyTrackInfo.getBaseURL());
            _config.addConfigParameter("Species", new StringType("species"), _legacyTrackInfo.getSpecies());
            _config.addConfigParameter("Revision", new StringType("revision"), _legacyTrackInfo.getRevision()); 
            _config.addConfigParameter("Target", new StringType("target"), _legacyTrackInfo.getTarget()); 
            _config.addConfigParameter("Offset", new IntegerType("offset"), Integer.toString(offset));
    
        }	
    
    	public TrackConfig getConfig() {
    		return _config;
    	}
    
    	
    
    	public void restoreProperties(Properties properties) {
    		_legacyTrackInfo.setBaseURL(properties.get("baseURL", _legacyTrackInfo.getBaseURL()));
    		_legacyTrackInfo.setSpecies(properties.get("species", _legacyTrackInfo.getSpecies()));
    		_legacyTrackInfo.setRevision(properties.get("revision", _legacyTrackInfo.getRevision()));
    		_legacyTrackInfo.setTarget(properties.get("target", _legacyTrackInfo.getTarget()));
    		offset = properties.getInt("offset", offset);
    	}
    
    	public void saveProperties(Properties saveData) {
    		saveData.add("baseURL", _legacyTrackInfo.getBaseURL());
    		saveData.add("species", _legacyTrackInfo.getSpecies());
    		saveData.add("revision", _legacyTrackInfo.getRevision());
    		saveData.add("target", _legacyTrackInfo.getTarget());
    		saveData.add("offset", offset);
    	}
    
    	public void onChangeTrackConfig(TrackConfigChange change) {
    		if(change.contains("name"))
    			getTrackInfo().setTrackName(change.getValue("name"));
    		
    		boolean drawFlag = false;
    		if(change.contains("offset"))
    		{
    			offset = change.getIntValue("offset");
    			drawFlag = true;
    		}
    		
    		String[] param = {"baseURL", "species", "revision", "target"};
    		if(change.containsOneOf(param))
    		{
    			_legacyTrackInfo.setBaseURL(change.getValue("baseURL"));
    			_legacyTrackInfo.setSpecies(change.getValue("species"));
    			_legacyTrackInfo.setRevision(change.getValue("revision"));
    			_legacyTrackInfo.setTarget(change.getValue("target"));
    			drawFlag =  true;
    		}
    		
    		if(drawFlag)
    			draw();
    
    	}
        
    }
    
  • Extend TrackBase? class
    • Implement factory() method
          public static TrackFactory factory()
          {
              return new TrackFactory(){
                  public Track newInstance()
                  {
                      return new LegacyTrack();
                  }
              };
          }
      
  • Implement getWidget() method
    • The returned widget is used to display track content
  • Set the default size of your track
    • via getDefaultWindowHight() method (pixel size)
  • Override draw() method when rewrite of your track is necessary
    • This method is used for updating track content on changes of track group properties
  • If you want to redraw the track content, call getFrame().onUpdateTrackWidget() insted of directly calling draw() method.
    • onUpdateTrackWidget() automatically resize track frame according to your track widget size.
  • To detect sequence location change, override onChangeTrackWindow() method.
  • To detect other track group property change, override onChangeTrackGroupProperty() method.
  • To add option configuration panel, create an instance of TrackConfig?, then override getTrackConfig() method.
    • If this method returns non-null instance, configuration button appears in your track frame.

  • Put all initialization codes of your track into setUp(...) method
  • To save your track state into view XML file, override saveProperties() method.
  • To load saved properties into your track from the user-specified XML file, override restoreProperties() method.
  • Edit the TrackFactorySetup? class as as to this class can instantiate your Track class.
    • In Eclipse, run TrackLoaderGenerator? (launch file is located at eclipse/TrackLoaderGenerator.launch) does this task.
Last modified 17 years ago Last modified on 10/12/07 22:06:43