package jalview.gui; import jalview.jbgui.GAlignmentPanel; import java.awt.*; import java.awt.image.*; import java.awt.event.*; import java.awt.print.*; import javax.swing.*; public class AlignmentPanel extends GAlignmentPanel implements AdjustmentListener, Printable { AlignViewport av; OverviewPanel overviewPanel; SeqPanel seqPanel; IdPanel idPanel; public AlignFrame alignFrame; ScalePanel scalePanel; ScorePanel scorePanel; public boolean groupEdit = false; public AlignmentPanel(AlignFrame af, AlignViewport av) { alignFrame = af; this.av = av; seqPanel = new SeqPanel (av, this); idPanel = new IdPanel (av, this); scalePanel = new ScalePanel(av); scorePanel = new ScorePanel(av); idPanelHolder.add(idPanel, BorderLayout.CENTER); idPanel.addNotify(); scalePanelHolder.add(scalePanel, BorderLayout.CENTER); scorePanelHolder.add(scorePanel, BorderLayout.CENTER); seqPanelHolder.add(seqPanel, BorderLayout.CENTER); setScrollValues(0,0); hscroll.addAdjustmentListener(this); vscroll.addAdjustmentListener(this); selectAll(false); addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent evt) { RefreshPanels(); } }); } public int countSelected() { return av.getSelection().size(); } public void selectAll(boolean flag) { int i = 0; if (flag) { while (i < av.getAlignment().getHeight()) { if (! av.getSelection().contains(av.getAlignment().getSequenceAt(i))) { av.getSelection().addElement(av.getAlignment().getSequenceAt(i)); } i++; } } else { av.getSelection().clear(); } } public OverviewPanel getOverviewPanel() { return overviewPanel; } public void setOverviewPanel(OverviewPanel op) { overviewPanel = op; } public void setGraphPanelVisible(boolean b) { scorePanelHolder.setVisible(b); idSpaceFillerPanel.setVisible(b); RefreshPanels(); } public void setWrapAlignment(boolean wrap) { scalePanelHolder.setVisible(!wrap); scorePanelHolder.setVisible(!wrap); hscroll.setVisible(!wrap); idSpaceFillerPanel.setVisible(!wrap); idSpaceFillerPanel1.setVisible(!wrap); } public void setColourScheme(jalview.schemes.ColourSchemeI cs, boolean conservation) { seqPanel.setColourScheme(cs, conservation); if(overviewPanel!=null) overviewPanel.updateOverviewImage(); } public void RefreshPanels() { invalidate(); validate(); idPanel.idCanvas.paintFlag = true; idPanelHolder.setPreferredSize( idPanel.idCanvas.getPreferredSize() ); seqPanel.seqCanvas.paintFlag = true; setScrollValues(av.getStartRes(), av.getStartSeq()); av.getConsensus(true); repaint(); if(overviewPanel!=null) overviewPanel.updateOverviewImage(); } int hextent = 0; int vextent = 0; public void setScrollValues(int x, int y) { hextent = (int)(seqPanel.seqCanvas.getWidth()/av.getCharWidth()); vextent = seqPanel.seqCanvas.getHeight()/av.getCharHeight(); if(hextent+x > av.getAlignment().getWidth()) x = av.getAlignment().getWidth()- hextent; if(vextent+y > av.getAlignment().getHeight()) y = av.getAlignment().getHeight() - vextent; if(y<0) y = 0; if(x<0) x=0; hscroll.setValues(x,hextent,0,av.getAlignment().getWidth()); vscroll.setValues(y,vextent,0,av.getAlignment().getHeight() ); seqPanel.seqCanvas.paintFlag = true; repaint(); } public void adjustmentValueChanged(AdjustmentEvent evt) { if (evt.getSource() == hscroll) { int x = hscroll.getValue(); av.setStartRes(x); av.setEndRes(x + (int)(seqPanel.seqCanvas.getWidth()/av.getCharWidth()-1)); } if (evt.getSource() == vscroll) { int offy = vscroll.getValue(); av.setStartSeq(offy); av.setEndSeq(offy + seqPanel.seqCanvas.getHeight()/av.getCharHeight()); } if(overviewPanel!=null) overviewPanel.setBoxPosition(); repaint(); } public int print(Graphics g, PageFormat pf, int pi) throws PrinterException { int pwidth = (int)pf.getImageableWidth(); int pheight = (int)pf.getImageableHeight(); int idWidth = (int)idPanel.idCanvas.getLabelWidth().getWidth(); BufferedImage printImage = new BufferedImage(pwidth,pheight,BufferedImage.TYPE_INT_RGB); Graphics pg = printImage.getGraphics(); pg.setColor(Color.white); pg.fillRect(0,0,pwidth, pheight); pg.setFont( av.getFont() ); //////////////////////////////////// /// How many sequences and residues can we fit on a printable page? int totalRes = (int)((pwidth - idWidth)/av.getCharWidth()); int totalSeq = (int)((pheight - 30)/av.getCharHeight())-1; int pagesWide = av.getAlignment().getWidth() / totalRes +1; int pagesHigh = av.getAlignment().getHeight() / totalSeq +1; if (pi >= pagesWide*pagesHigh) return Printable.NO_SUCH_PAGE; ///////////////////////////// /// Only print these sequences and residues on this page int startRes, endRes, startSeq, endSeq; startRes = (pi % pagesWide) * totalRes; endRes = startRes + totalRes-1; if(endRes>av.getAlignment().getWidth()) endRes = av.getAlignment().getWidth(); startSeq = (pi / pagesWide) * totalSeq; endSeq = startSeq + totalSeq; if(endSeq > av.getAlignment().getHeight()) endSeq = av.getAlignment().getHeight(); //////////////// //draw Scale pg.translate(idWidth,0); scalePanel.scaleCanvas.drawScale(pg, startRes, endRes, pwidth-idWidth); pg.translate(-idWidth, 30); //////////////// // Draw the ids Color currentColor=null; Color currentTextColor=null; for(int i=startSeq; i