X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FTreeCanvas.java;h=d4c88de7acb8c238b51d0079145034ce66379d4b;hb=e7ed63f1ea56432246a6ed1553f0fe56d26f56ea;hp=1a11630dce8ffbd7f98297ae24db26df8d641621;hpb=1ecf6419aba86993b3c223bf5ec0fa79427baf85;p=jalview.git diff --git a/src/jalview/gui/TreeCanvas.java b/src/jalview/gui/TreeCanvas.java index 1a11630..d4c88de 100755 --- a/src/jalview/gui/TreeCanvas.java +++ b/src/jalview/gui/TreeCanvas.java @@ -4,13 +4,14 @@ 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; @@ -19,20 +20,20 @@ public class TreeCanvas extends JPanel implements MouseListener Font font; int fontSize = 12; + boolean fitToWindow = true; boolean showDistances = false; boolean showBootstrap = 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 +43,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 +52,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; @@ -91,11 +90,20 @@ public class TreeCanvas extends JPanel implements MouseListener int ypos = (int)(node.ycount * chunk) + offy; - if (node.element() instanceof SequenceI) { - g.setColor(((SequenceI)((SequenceNode)node).element()).getColor().darker()); - } else { - g.setColor(Color.black); + if (node.element() instanceof SequenceI) + { + if ( ( (SequenceI) ( (SequenceNode) node).element()).getColor() == Color.white) + { + g.setColor(Color.black); + } + else + g.setColor( ( (SequenceI) ( (SequenceNode) node).element()).getColor(). + darker()); + } + else + g.setColor(Color.black); + // Draw horizontal line g.drawLine(xstart,ypos,xend,ypos); @@ -125,7 +133,8 @@ public class TreeCanvas extends JPanel implements MouseListener nameHash.put((SequenceI)node.element(),rect); - if (selected.contains((SequenceI)node.element())) { + 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); @@ -192,7 +201,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(); @@ -205,10 +214,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; } @@ -225,40 +234,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); @@ -269,24 +345,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() { @@ -296,12 +365,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(); @@ -312,7 +384,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) { } @@ -322,6 +407,9 @@ public class TreeCanvas extends JPanel implements MouseListener } public void mousePressed(MouseEvent e) { + + av.setCurrentTree(tree); + int x = e.getX(); int y = e.getY(); @@ -342,28 +430,59 @@ 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++) + { - int tmp = i%(7); 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()); + 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); } } } + PaintRefresher.Refresh(this); repaint(); }