X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FTreeCanvas.java;h=9435716e3cf9c63f75416d81cb5c5ece259a8dfe;hb=f1eef48c0073f03279b444dc297780c26d238cd8;hp=484e05a9668224f93216b12088692bfc0c98d10e;hpb=d761f4d026e1133c507f2bd51f88b10ed7449c7d;p=jalview.git diff --git a/src/jalview/gui/TreeCanvas.java b/src/jalview/gui/TreeCanvas.java index 484e05a..9435716 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,6 +20,7 @@ public class TreeCanvas extends JPanel implements MouseListener Font font; int fontSize = 12; + boolean fitToWindow = true; boolean showDistances = false; boolean showBootstrap = false; @@ -32,7 +34,6 @@ public class TreeCanvas extends JPanel implements MouseListener //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; @@ -134,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); @@ -201,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(); @@ -214,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; } @@ -234,40 +234,90 @@ 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); + FontMetrics fm = pg.getFontMetrics(font); + + pg.translate((int)pf.getImageableX(), (int)pf.getImageableY()); + + int pwidth = (int) pf.getImageableWidth(); + int pheight = (int) pf.getImageableHeight(); + + // adjust pheight to row height + pheight -= (pheight%fm.getHeight()); + pg.setClip(0,0, pwidth, pheight); + + int noPages = (fm.getHeight() * nameHash.size()) / pheight; + + if(pi>noPages) + return Printable.NO_SUCH_PAGE; + + pg.translate(0, -pheight*pi ); + draw(pg, pwidth, fm.getHeight() * nameHash.size()); - public void paintComponent(Graphics g) { + return Printable.PAGE_EXISTS; + } + + public void paintComponent(Graphics g) + { font = new Font("Verdana",Font.PLAIN,fontSize); g.setFont(font); @@ -278,15 +328,15 @@ 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()); } @@ -357,15 +407,47 @@ public class TreeCanvas extends JPanel implements MouseListener tree.groupNodes(tree.getTopNode(),fthreshold); 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, 100); + ccs = new ConservationColourScheme(c, ccs.cs); + + sg.cs = ccs; + + } + + + + av.alignment.addGroup(sg); } }