X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FTreeCanvas.java;h=f9cb39c590c83302c652ba4944540490f819efa6;hb=82e0c09533b4f568b50fdc290be58589cea3ebb6;hp=484e05a9668224f93216b12088692bfc0c98d10e;hpb=d761f4d026e1133c507f2bd51f88b10ed7449c7d;p=jalview.git diff --git a/src/jalview/gui/TreeCanvas.java b/src/jalview/gui/TreeCanvas.java index 484e05a..f9cb39c 100755 --- a/src/jalview/gui/TreeCanvas.java +++ b/src/jalview/gui/TreeCanvas.java @@ -4,35 +4,37 @@ package jalview.gui; import jalview.analysis.*; import jalview.datamodel.*; import jalview.util.*; +import jalview.schemes.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; -import java.io.*; +import java.awt.print.*; -public class TreeCanvas extends JPanel implements MouseListener +public class TreeCanvas extends JPanel implements MouseListener, Runnable, Printable { NJTree tree; JScrollPane scrollPane; AlignViewport av; - + public static final String PLACEHOLDER=" * "; Font font; int fontSize = 12; + boolean fitToWindow = true; boolean showDistances = false; boolean showBootstrap = false; + boolean markPlaceholders = false; int offx = 20; int offy = 20; - int threshold; + float threshold; String longestName; int labelLength=-1; //RubberbandRectangle rubberband; - Selection selected; Vector listeners; Hashtable nameHash = new Hashtable(); @@ -42,7 +44,6 @@ public class TreeCanvas extends JPanel implements MouseListener { this.av = av; this.tree = tree; - selected = av.getSelection(); scrollPane = scroller; addMouseListener(this); tree.findHeight(tree.getTopNode()); @@ -52,23 +53,22 @@ public class TreeCanvas extends JPanel implements MouseListener } public void TreeSelectionChanged(Sequence sequence) { - selected = av.getSelection(); + SequenceGroup selected = av.getSelectionGroup(); + if(selected == null) + { + selected = new SequenceGroup(); + av.setSelectionGroup(selected); + } + + selected.setEndRes(av.alignment.getWidth()); + selected.addOrRemove(sequence); - if (selected.contains(sequence)) - selected.removeElement(sequence); - else - selected.addElement(sequence); - setSelected(selected); PaintRefresher.Refresh(this); repaint(); } - public void setSelected(Selection selected) - { - this.selected = selected; - } public void setTree(NJTree tree) { this.tree = tree; @@ -123,10 +123,9 @@ public class TreeCanvas extends JPanel implements MouseListener g.drawString(nodeLabel,xstart,ypos - 10); } - // Colour selected leaves differently - String name = node.getName(); + String name = (markPlaceholders && node.isPlaceholder()) ? (PLACEHOLDER+node.getName()) : node.getName(); FontMetrics fm = g.getFontMetrics(font); - int charWidth = fm.stringWidth(node.getName()) + 3; + int charWidth = fm.stringWidth(name) + 3; int charHeight = fm.getHeight(); Rectangle rect = new Rectangle(xend+20,ypos-charHeight, @@ -134,13 +133,15 @@ public class TreeCanvas extends JPanel implements MouseListener nameHash.put((SequenceI)node.element(),rect); - if (selected.contains((SequenceI)node.element())) { + // Colour selected leaves differently + SequenceGroup selected = av.getSelectionGroup(); + if (selected!=null && selected.sequences.contains((SequenceI)node.element())) { g.setColor(Color.gray); g.fillRect(xend + 10, ypos - charHeight + 3,charWidth,charHeight); g.setColor(Color.white); } - g.drawString(node.getName(),xend+10,ypos); + g.drawString(name,xend+10,ypos); g.setColor(Color.black); } else { drawNode(g,(SequenceNode)node.left(), chunk,scale,width,offx,offy); @@ -201,7 +202,7 @@ public class TreeCanvas extends JPanel implements MouseListener } - public void pickNodes(Rectangle pickBox, Selection sel) { + public void pickNodes(Rectangle pickBox) { int width = getWidth(); int height = getHeight(); @@ -214,10 +215,10 @@ public class TreeCanvas extends JPanel implements MouseListener } float chunk = (float)(height-offy*2)/top.count; - pickNode(pickBox,sel,top,chunk,wscale,width,offx,offy); + pickNode(pickBox,top,chunk,wscale,width,offx,offy); } - public void pickNode(Rectangle pickBox, Selection sel, SequenceNode node, float chunk, float scale, int width,int offx, int offy) { + public void pickNode(Rectangle pickBox, SequenceNode node, float chunk, float scale, int width,int offx, int offy) { if (node == null) { return; } @@ -234,40 +235,107 @@ public class TreeCanvas extends JPanel implements MouseListener if (pickBox.contains(new Point(xend,ypos))) { if (node.element() instanceof SequenceI) { SequenceI seq = (SequenceI)node.element(); - if (sel.contains(seq)) { - sel.removeElement(seq); - } else { - sel.addElement(seq); - } + SequenceGroup sg = av.getSelectionGroup(); + if(sg!=null) + sg.addOrRemove(seq); } } } else { - pickNode(pickBox,sel,(SequenceNode)node.left(), chunk,scale,width,offx,offy); - pickNode(pickBox,sel,(SequenceNode)node.right(),chunk,scale,width,offx,offy); + pickNode(pickBox,(SequenceNode)node.left(), chunk,scale,width,offx,offy); + pickNode(pickBox,(SequenceNode)node.right(),chunk,scale,width,offx,offy); } } - public void setColor(SequenceNode node, Color c) { - if (node == null) { + public void setColor(SequenceNode node, Color c) + { + if (node == null) return; - } - if (node.left() == null && node.right() == null) { + if (node.left() == null && node.right() == null) + { node.color = c; - if (node.element() instanceof SequenceI) { + if (node.element() instanceof SequenceI) ((SequenceI)node.element()).setColor(c); - } - } else { + } else + { node.color = c; setColor((SequenceNode)node.left(),c); setColor((SequenceNode)node.right(),c); } } + void startPrinting() + { + Thread thread = new Thread(this); + thread.start(); + } + + // put printing in a thread to avoid painting problems + public void run() + { + PrinterJob printJob = PrinterJob.getPrinterJob(); + PageFormat pf = printJob.pageDialog(printJob.defaultPage()); + + printJob.setPrintable(this, pf); + if (printJob.printDialog()) + { + try + { + printJob.print(); + } + catch (Exception PrintException) + { + PrintException.printStackTrace(); + } + } + } + + + public int print(Graphics pg, PageFormat pf, int pi) throws PrinterException + { + + pg.setFont(font); + pg.translate((int)pf.getImageableX(), (int)pf.getImageableY()); + int pwidth = (int) pf.getImageableWidth(); + int pheight = (int) pf.getImageableHeight(); + + int noPages = getHeight() / pheight; + if(pi>noPages) + return Printable.NO_SUCH_PAGE; + - public void paintComponent(Graphics g) { + if (pwidth > getWidth()) + pwidth = getWidth(); + if(fitToWindow) + { + if (pheight > getHeight()) + pheight = getHeight(); + + noPages = 0; + } + else + { + + FontMetrics fm = pg.getFontMetrics(font); + int height = fm.getHeight() * nameHash.size(); + pg.translate(0, -pi*pheight ); + pg.setClip(0,pi*pheight, pwidth,pi*pheight + pheight); + // translate number of pages, + // height is screen size as this is the + // non overlapping text size + pheight = height; + } + + draw(pg, pwidth, pheight); + + return Printable.PAGE_EXISTS; + + } + + public void paintComponent(Graphics g) + { font = new Font("Verdana",Font.PLAIN,fontSize); g.setFont(font); @@ -278,24 +346,17 @@ public class TreeCanvas extends JPanel implements MouseListener repaint(); - if( scrollPane.getHeight() > fm.getHeight() * nameHash.size()+offy) + if( fitToWindow || (!fitToWindow && scrollPane.getHeight() > fm.getHeight() * nameHash.size()+offy ) ) { draw(g,scrollPane.getWidth(),scrollPane.getHeight()); - setPreferredSize(new Dimension(scrollPane.getWidth(), scrollPane.getHeight())); + setPreferredSize(null); } else { - setPreferredSize(new Dimension(getWidth(), fm.getHeight() * nameHash.size())); - draw( g,getWidth(), fm.getHeight() * nameHash.size()); + setPreferredSize(new Dimension(scrollPane.getWidth(), fm.getHeight() * nameHash.size())); + draw( g,scrollPane.getWidth(), fm.getHeight() * nameHash.size()); } - - if (threshold != 0) - { - g.setColor(Color.red); - g.drawLine(threshold,0,threshold,getHeight()); - } - scrollPane.revalidate(); } public int getFontSize() { @@ -305,12 +366,15 @@ public class TreeCanvas extends JPanel implements MouseListener this.fontSize = fontSize; repaint(); } - public void draw(Graphics g, int width, int height) { - g.setColor(Color.white); - g.fillRect(0,0,width,height); + public void draw(Graphics g1, int width, int height) { + Graphics2D g2 = (Graphics2D)g1; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setColor(Color.white); + g2.fillRect(0,0,width,height); - labelLength = g.getFontMetrics(font).stringWidth(longestName)+ 20;//20 allows for scrollbar + + labelLength = g2.getFontMetrics(font).stringWidth(longestName)+ 20;//20 allows for scrollbar float wscale =(float)(width - labelLength -offx*2)/tree.getMaxHeight(); @@ -321,7 +385,20 @@ public class TreeCanvas extends JPanel implements MouseListener } float chunk = (float)(height-offy*2)/top.count ; - drawNode(g,tree.getTopNode(),chunk,wscale,width,offx,offy); + drawNode(g2,tree.getTopNode(),chunk,wscale,width,offx,offy); + + if (threshold != 0) + { + if(av.getCurrentTree() == tree) + g2.setColor(Color.red); + else + g2.setColor(Color.gray); + + int x = (int)( threshold * (float)(getWidth()-labelLength - 2*offx) +offx ) ; + + g2.drawLine(x,0,x,getHeight()); + } + } public void mouseReleased(MouseEvent e) { } @@ -331,6 +408,9 @@ public class TreeCanvas extends JPanel implements MouseListener } public void mousePressed(MouseEvent e) { + + av.setCurrentTree(tree); + int x = e.getX(); int y = e.getY(); @@ -351,21 +431,53 @@ public class TreeCanvas extends JPanel implements MouseListener // Find threshold if (tree.getMaxHeight() != 0) { - float fthreshold = (float)(x - offx)/(float)(getWidth()-labelLength - 2*offx); - this.threshold = x; + threshold = (float)(x - offx)/(float)(getWidth()-labelLength - 2*offx); + tree.getGroups().removeAllElements(); - tree.groupNodes(tree.getTopNode(),fthreshold); + tree.groupNodes(tree.getTopNode(),threshold); setColor(tree.getTopNode(),Color.black); - for (int i=0; i < tree.getGroups().size(); i++) { + av.setSelectionGroup(null); + av.alignment.deleteAllGroups(); + + for (int i=0; i < tree.getGroups().size(); i++) + { Color col = new Color((int)(Math.random()*255), (int)(Math.random()*255), (int)(Math.random()*255)); setColor((SequenceNode)tree.getGroups().elementAt(i),col.brighter()); - // l is vector of Objects - // Vector l = tree.findLeaves((SequenceNode)tree.getGroups().elementAt(i),new Vector()); + Vector l = tree.findLeaves((SequenceNode)tree.getGroups().elementAt(i),new Vector()); + SequenceGroup sg = null; + for (int j = 0; j < l.size(); j++) + { + SequenceNode sn = (SequenceNode) l.elementAt(j); + if(sg==null) + sg = new SequenceGroup("TreeGroup", av.getGlobalColourScheme(), true, true,false,0,av.alignment.getWidth()); + + sg.addSequence( (Sequence) sn.element()); + } + + if (av.getGlobalColourScheme() instanceof ConservationColourScheme) + { + ConservationColourScheme ccs = (ConservationColourScheme) av.getGlobalColourScheme(); + Conservation c = new Conservation("Group", + ResidueProperties.propHash, 3, + sg.sequences, sg.getStartRes(), + sg.getEndRes()); + + c.calculate(); + c.verdict(false, av.ConsPercGaps); + ccs = new ConservationColourScheme(c, ccs.cs); + + sg.cs = ccs; + + } + + + + av.alignment.addGroup(sg); } } @@ -385,6 +497,10 @@ public class TreeCanvas extends JPanel implements MouseListener this.showBootstrap = state; repaint(); } + public void setMarkPlaceholders(boolean state) { + this.markPlaceholders = state; + repaint(); + } }