X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FIdCanvas.java;h=2faea017a8144c7a6c04c62a270ddd5c07484026;hb=refs%2Fheads%2Fspike%2FJAL-4047%2FJAL-4048_columns_in_sequenceID;hp=ab5585c18529d1c96b26e90ed4184fb45f1bf190;hpb=8f737246c031bae47c05363b5d5aef29567fa38d;p=jalview.git diff --git a/src/jalview/gui/IdCanvas.java b/src/jalview/gui/IdCanvas.java index ab5585c..2faea01 100755 --- a/src/jalview/gui/IdCanvas.java +++ b/src/jalview/gui/IdCanvas.java @@ -20,12 +20,9 @@ */ package jalview.gui; -import jalview.datamodel.SequenceI; -import jalview.viewmodel.ViewportListenerI; -import jalview.viewmodel.ViewportRanges; - import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; @@ -37,6 +34,13 @@ import java.util.List; import javax.swing.JPanel; +import jalview.datamodel.SequenceI; +import jalview.viewmodel.ViewportListenerI; +import jalview.viewmodel.ViewportRanges; +import jalview.viewmodel.seqfeatures.IdColumn; +import jalview.viewmodel.seqfeatures.IdColumns; +import jalview.viewmodel.seqfeatures.IdColumns.ColumnCell; + /** * DOCUMENT ME! * @@ -55,7 +59,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI BufferedImage image; - Graphics2D gg; + // Graphics2D gg; int imgHeight = 0; @@ -79,7 +83,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI this.av = av; PaintRefresher.Register(this, av.getSequenceSetId()); av.getRanges().addPropertyChangeListener(this); - } + } /** * DOCUMENT ME! @@ -137,7 +141,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI g.drawString(s.getDisplayId(av.getShowJVSuffix()), xPos, (((i - starty + 1) * charHeight) + ypos) - (charHeight / 5)); - if (hiddenRows) + if (hiddenRows && av.getShowHiddenMarkers()) { drawMarker(g, av, i, starty, ypos); } @@ -152,10 +156,11 @@ public class IdCanvas extends JPanel implements ViewportListenerI */ public void fastPaint(int vertical) { + /* * for now, not attempting fast paint of wrapped ids... */ - if (gg == null || av.getWrapAlignment()) + if (image == null || av.getWrapAlignment()) { repaint(); @@ -164,6 +169,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI ViewportRanges ranges = av.getRanges(); + Graphics2D gg = image.createGraphics(); gg.copyArea(0, 0, getWidth(), imgHeight, 0, -vertical * av.getCharHeight()); @@ -196,10 +202,12 @@ public class IdCanvas extends JPanel implements ViewportListenerI gg.translate(0, transY); - drawIds(gg, av, ss, es, searchResults); + drawIds(gg, av, ss, es, searchResults,true); gg.translate(0, -transY); + gg.dispose(); + fastPaint = true; // Call repaint on alignment panel so that repaints from other alignment @@ -217,43 +225,44 @@ public class IdCanvas extends JPanel implements ViewportListenerI @Override public void paintComponent(Graphics g) { - super.paintComponent(g); - g.setColor(Color.white); g.fillRect(0, 0, getWidth(), getHeight()); - + if (fastPaint) { fastPaint = false; g.drawImage(image, 0, 0, this); - + return; } - + int oldHeight = imgHeight; - + imgHeight = getHeight(); imgHeight -= (imgHeight % av.getCharHeight()); - + if (imgHeight < 1) { return; } - + if (oldHeight != imgHeight || image.getWidth(this) != getWidth()) { - image = new BufferedImage(getWidth(), imgHeight, - BufferedImage.TYPE_INT_RGB); + image = new BufferedImage(getWidth(), imgHeight, + BufferedImage.TYPE_INT_RGB); } - - gg = (Graphics2D) image.getGraphics(); - + + Graphics2D gg = image.createGraphics(); + // Fill in the background gg.setColor(Color.white); gg.fillRect(0, 0, getWidth(), imgHeight); - - drawIds(gg, av, av.getRanges().getStartSeq(), av.getRanges().getEndSeq(), searchResults); - + + drawIds(gg, av, av.getRanges().getStartSeq(), + av.getRanges().getEndSeq(), searchResults,true); + + gg.dispose(); + g.drawImage(image, 0, 0, this); } @@ -269,14 +278,13 @@ public class IdCanvas extends JPanel implements ViewportListenerI * @param endSeq * @param selection */ - void drawIds(Graphics2D g, AlignViewport alignViewport, final int startSeq, - final int endSeq, List selection) + void drawIds(Graphics2D g, AlignViewport alignViewport, + final int startSeq, final int endSeq, List selection, boolean forGUI) { Font font = alignViewport.getFont(); if (alignViewport.isSeqNameItalics()) { - setIdfont(new Font(font.getName(), Font.ITALIC, - font.getSize())); + setIdfont(new Font(font.getName(), Font.ITALIC, font.getSize())); } else { @@ -304,22 +312,31 @@ public class IdCanvas extends JPanel implements ViewportListenerI } // Now draw the id strings - int panelWidth = getWidth(); - int xPos = 0; + int fullPanelWidth = getWidth(); + + IdColumns id_cols = alignViewport.getIdColumns(); + List visible = id_cols.getVisible(); + /** + * width of an idColumn + */ + int colWid = 20; + int panelWidth = Math.max(fullPanelWidth / 2, + fullPanelWidth - (colWid * visible.size())); // Now draw the id strings for (int i = startSeq; i <= endSeq; i++) { + int xPos = 0; SequenceI sequence = alignViewport.getAlignment().getSequenceAt(i); if (sequence == null) { continue; } - if (hasHiddenRows || alignViewport.isDisplayReferenceSeq()) { g.setFont(getHiddenFont(sequence, alignViewport)); + fm = g.getFontMetrics(); } // Selected sequence colours @@ -343,8 +360,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI g.setColor(currentColor); int charHeight = alignViewport.getCharHeight(); - g.fillRect(0, (i - startSeq) * charHeight, - getWidth(), charHeight); + g.fillRect(0, (i - startSeq) * charHeight, getWidth(), charHeight); g.setColor(currentTextColor); @@ -356,10 +372,42 @@ public class IdCanvas extends JPanel implements ViewportListenerI xPos = panelWidth - fm.stringWidth(string) - 4; } - g.drawString(string, xPos, (((i - startSeq) * charHeight) + charHeight) - - (charHeight / 5)); + g.drawString(string, xPos, + (((i - startSeq) * charHeight) + charHeight) + - (charHeight / 5)); - if (hasHiddenRows) + if (visible != null && visible.size() > 0) + { + try + { + xPos = panelWidth + 2; + for (IdColumn col : visible) + { + ColumnCell col_cell = id_cols.getCellFor(sequence, col); + if (col_cell == null) + { + g.setColor(Color.gray); + g.fillRect(xPos + 1, (i - startSeq) * charHeight, + xPos + colWid - 3, charHeight); + } + else + { + g.setColor(col_cell.bg); + g.fillRect(xPos + 1, (i - startSeq) * charHeight, + xPos + colWid - 3, charHeight); + g.setColor(col_cell.fg); + g.drawString(col_cell.label, xPos, + (((i - startSeq) * charHeight) + charHeight) + - (charHeight / 5)); + } + xPos += colWid; + g.setColor(currentTextColor); + } + } catch (Exception q) + { + } + } + if (hasHiddenRows && av.getShowHiddenMarkers()) { drawMarker(g, alignViewport, i, startSeq, 0); } @@ -377,36 +425,42 @@ public class IdCanvas extends JPanel implements ViewportListenerI void drawIdsWrapped(Graphics2D g, AlignViewport alignViewport, int startSeq, int pageHeight) { + drawIdsWrapped(g, alignViewport, startSeq, pageHeight, -1, true); + } + + /** + * render sequence IDs and annotation labels when wrapped - without GUI junk + * @param g + * @param av2 + * @param i + * @param totalHeight + */ + public void drawIdsWrappedNoGUI(Graphics2D g, AlignViewport av2, int i, + int totalHeight) + { + drawIdsWrapped(g, av2, totalHeight, totalHeight, i,false); + } + + void drawIdsWrapped(Graphics2D g, AlignViewport alignViewport, + int startSeq, int pageHeight, int idWidth, boolean forGUI) + { int alignmentWidth = alignViewport.getAlignment().getWidth(); final int alheight = alignViewport.getAlignment().getHeight(); - int annotationHeight = 0; + /* + * assumption: SeqCanvas.calculateWrappedGeometry has been called + */ + SeqCanvas seqCanvas = alignViewport.getAlignPanel() + .getSeqPanel().seqCanvas; final int charHeight = alignViewport.getCharHeight(); - int hgap = charHeight; - if (alignViewport.getScaleAboveWrapped()) - { - hgap += charHeight; - } AnnotationLabels labels = null; if (alignViewport.isShowAnnotation()) { - if (ap == null) - { - ap = new AnnotationPanel(alignViewport); - } - annotationHeight = ap.adjustPanelHeight() - + SeqCanvas.SEQS_ANNOTATION_GAP; labels = new AnnotationLabels(alignViewport); } - /* - * height of alignment + gap + annotations (if shown) - */ - int cHeight = alheight * charHeight + hgap - + annotationHeight; - ViewportRanges ranges = alignViewport.getRanges(); int rowSize = ranges.getViewportWidth(); @@ -416,7 +470,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI * out of visible space, whichever comes first */ boolean hasHiddenRows = alignViewport.hasHiddenRows(); - int ypos = hgap; + int ypos = seqCanvas.wrappedSpaceAboveAlignment; int rowStartRes = ranges.getStartRes(); while ((ypos <= pageHeight) && (rowStartRes < alignmentWidth)) { @@ -436,12 +490,27 @@ public class IdCanvas extends JPanel implements ViewportListenerI if (labels != null && alignViewport.isShowAnnotation()) { + int getWidth = getWidth(); + int thisIdWidth = getWidth; g.translate(0, ypos + (alheight * charHeight)); - labels.drawComponent(g, getWidth()); + if (!manuallyAdjusted()) + { + int getAnnotationsIdWidth = labels.drawLabels(g, false, -1, false,forGUI, + null); + thisIdWidth = idWidth < 0 ? getAnnotationsIdWidth : idWidth; + if (thisIdWidth > getWidth) + { + this.setPreferredSize( + new Dimension(thisIdWidth, this.getHeight())); + this.repaint(); + alignViewport.setIdWidth(thisIdWidth); + } + } + labels.drawComponent(g, false, thisIdWidth, forGUI); g.translate(0, -ypos - (alheight * charHeight)); } - ypos += cHeight; + ypos += seqCanvas.wrappedRepeatHeightPx; rowStartRes += rowSize; } } @@ -456,7 +525,8 @@ public class IdCanvas extends JPanel implements ViewportListenerI * @param starty * @param yoffset */ - void drawMarker(Graphics2D g, AlignViewport alignViewport, int seqIndex, int starty, int yoffset) + void drawMarker(Graphics2D g, AlignViewport alignViewport, int seqIndex, + int starty, int yoffset) { SequenceI[] hseqs = alignViewport.getAlignment() .getHiddenSequences().hiddenSequences; @@ -499,8 +569,7 @@ public class IdCanvas extends JPanel implements ViewportListenerI /* * vertices of the triangle, below or above hidden seqs */ - int[] xPoints = new int[] - { getWidth() - charHeight, + int[] xPoints = new int[] { getWidth() - charHeight, getWidth() - charHeight, getWidth() }; int yShift = seqIndex - starty; @@ -593,4 +662,17 @@ public class IdCanvas extends JPanel implements ViewportListenerI repaint(); } } + + private boolean manuallyAdjusted = false; + + public boolean manuallyAdjusted() + { + return manuallyAdjusted; + } + + public void setManuallyAdjusted(boolean b) + { + manuallyAdjusted = b; + } + }