/* * Created on Nov 9, 2006 * * TODO * * To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package org.seqcode.projects.seqview.paintable; import java.awt.*; import java.awt.event.MouseEvent; import java.util.*; import javax.swing.JMenuItem; import org.seqcode.genome.location.Region; import org.seqcode.projects.seqview.RectangleLookup; /** * @author tdanford */ public class MultiGenePainter extends RegionPaintable { private Vector<GenePainter> genePainters; private RectangleLookup<GenePainter> posLookup; private GeneProperties props; private int readyCount; public MultiGenePainter() { super(); genePainters = new Vector<GenePainter>(); setCanPaint(false); setWantsPaint(false); readyCount = 0; props = new GeneProperties(); posLookup = new RectangleLookup<GenePainter>(); } public GeneProperties getProperties() {return props;} public void cleanup() { super.cleanup(); posLookup.clear(); for(GenePainter gp : genePainters) { gp.cleanup(); } } public void addGenePainter(GenePainter gp) { genePainters.add(gp); gp.addEventListener(this); gp.setProperties(props); } public void removeGenePainter(GenePainter gp) { genePainters.remove(gp); gp.removeEventListener(this); } private int countCanPaint() { int count = 0; for(GenePainter gp : genePainters) { if(gp.canPaint()) { count += 1; } } return count; } public synchronized void eventRegistered(EventObject evt) { readyCount = countCanPaint(); if(readyCount == genePainters.size()) { setCanPaint(true); setWantsPaint(true); notifyListeners(); } else { setCanPaint(false); setWantsPaint(false); } } public void setRegion(Region r) { super.setRegion(r); for(GenePainter gp : genePainters) { gp.setRegion(r); } readyCount = genePainters.size(); } public int getNumTracks() { int count = 0; for(GenePainter gp : genePainters) { count += gp.getNumTracks(); } return count; } public ArrayList<JMenuItem> mouseClickedMenu(MouseEvent e) { ArrayList<JMenuItem> items = super.mouseClickedMenu(e); if(items == null) { items = new ArrayList<JMenuItem>(); } Point p = e.getPoint(); Collection<GenePainter> subPainters = posLookup.getAllValues(p); for(GenePainter gp : subPainters) { ArrayList<JMenuItem> subitems = gp.mouseClickedMenu(e); if(subitems != null) { items.addAll(subitems); } } if(items.size() == 0) { return null; } return items; } public int getMaxVertSpace() { int numTracks = getNumTracks(); return Math.min(Math.max(40,numTracks * 25),120); } public int getMinVertSpace() { int numTracks = getNumTracks(); return Math.min(Math.max(40,numTracks * 25),120); } public void paintItem(Graphics2D g, int x1, int y1, int x2, int y2) { int totalTracks = Math.max(1, getNumTracks()); int w = x2 - x1, h = y2 - y1; int yOffset = y1; posLookup.clear(); for(int i = 0; i < genePainters.size(); i++) { GenePainter gp = genePainters.get(i); int tracks = gp.getNumTracks(); double tf = (double)tracks / (double)totalTracks; int height = (int)Math.floor(tf * (double)h); gp.paintItem(g, x1, yOffset, x2, yOffset + height); Rectangle rect = new Rectangle(x1, yOffset, x2-x1, height); posLookup.addValue(gp, rect); yOffset += height; } } }