X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2F%23OverviewPanel.java%23;fp=src%2Fjalview%2Fgui%2F%23OverviewPanel.java%23;h=0000000000000000000000000000000000000000;hb=17b7d054cf7faa5ee57ad8c8c4c9daa495d8cb35;hp=ce3abb5f3f392ffad030dc646606acc1b07e50ab;hpb=4a59f639cf5769d9ec66142ebecfa4961c5d3b04;p=jalview.git diff --git a/src/jalview/gui/#OverviewPanel.java# b/src/jalview/gui/#OverviewPanel.java# deleted file mode 100755 index ce3abb5..0000000 --- a/src/jalview/gui/#OverviewPanel.java# +++ /dev/null @@ -1,468 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * This file is part of Jalview. - * - * Jalview is free software: you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation, either version 3 - * of the License, or (at your option) any later version. - * - * Jalview is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Jalview. If not, see . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ -package jalview.gui; - -import jalview.datamodel.SequenceI; -import jalview.renderer.AnnotationRenderer; -import jalview.viewmodel.OverviewDimensions; -import jalview.renderer.seqfeatures.FeatureColourFinder; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionAdapter; -import java.awt.image.BufferedImage; - -import javax.swing.JPanel; - -/** - * Panel displaying an overview of the full alignment, with an interactive box - * representing the viewport onto the alignment. - * - * @author $author$ - * @version $Revision$ - */ -public class OverviewPanel extends JPanel implements Runnable -{ - private static final Color TRANS_GREY = new Color(100, 100, 100, 25); - - private final AnnotationRenderer renderer = new AnnotationRenderer(); - - private OverviewDimensions od; - - private BufferedImage miniMe; - - private BufferedImage lastMiniMe = null; - - private AlignViewport av; - - private AlignmentPanel ap; - - // - private boolean resizing = false; - - // This is set true if the user resizes whilst - // the overview is being calculated - private boolean resizeAgain = false; - - // Can set different properties in this seqCanvas than - // main visible SeqCanvas - private SequenceRenderer sr; - - private jalview.renderer.seqfeatures.FeatureRenderer fr; - - /** - * Creates a new OverviewPanel object. - * - * @param alPanel - * The alignment panel which is shown in the overview panel - */ - public OverviewPanel(AlignmentPanel alPanel) - { - this.av = alPanel.av; - this.ap = alPanel; - setLayout(null); - - sr = new SequenceRenderer(av); - sr.renderGaps = false; - sr.forOverview = true; - fr = new FeatureRenderer(alPanel); - - od = new OverviewDimensions(av.getRanges(), av.isShowAnnotation()); - - addComponentListener(new ComponentAdapter() - { - @Override - public void componentResized(ComponentEvent evt) - { - if ((getWidth() != od.getWidth()) - || (getHeight() != (od.getHeight()))) - { - updateOverviewImage(); - } - } - }); - - addMouseMotionListener(new MouseMotionAdapter() - { - @Override - public void mouseDragged(MouseEvent evt) - { - if (!av.getWrapAlignment()) - { - od.updateViewportFromMouse(evt.getX(), evt.getY(), av - .getAlignment().getHiddenSequences(), av - .getColumnSelection(), av.getRanges()); - ap.setScrollValues(od.getScrollCol(), od.getScrollRow()); - } - } - }); - - addMouseListener(new MouseAdapter() - { - @Override - public void mousePressed(MouseEvent evt) - { - if (!av.getWrapAlignment()) - { - od.updateViewportFromMouse(evt.getX(), evt.getY(), av - .getAlignment().getHiddenSequences(), av - .getColumnSelection(), av.getRanges()); - ap.setScrollValues(od.getScrollCol(), od.getScrollRow()); - } - } - }); - - updateOverviewImage(); - } - - /** - * Updates the overview image when the related alignment panel is updated - */ - public void updateOverviewImage() - { - if (resizing) - { - resizeAgain = true; - return; - } - - resizing = true; - - if ((getWidth() > 0) && (getHeight() > 0)) - { - od.setWidth(getWidth()); - od.setHeight(getHeight()); - } - - setPreferredSize(new Dimension(od.getWidth(), od.getHeight())); - - Thread thread = new Thread(this); - thread.start(); - repaint(); - } - - @Override - public void run() - { - miniMe = null; - - if (av.isShowSequenceFeatures()) - { - fr.transferSettings(ap.getSeqPanel().seqCanvas.getFeatureRenderer()); - } - - // why do we need to set preferred size again? was set in - // updateOverviewImage - setPreferredSize(new Dimension(od.getWidth(), od.getHeight())); - - miniMe = new BufferedImage(od.getWidth(), od.getHeight(), - BufferedImage.TYPE_INT_RGB); - - Graphics mg = miniMe.getGraphics(); - mg.setColor(Color.orange); - mg.fillRect(0, 0, od.getWidth(), miniMe.getHeight()); - -<<<<<<< HEAD - // calculate sampleCol and sampleRow - // alignment width is max number of residues/bases - // alignment height is number of sequences - int alwidth = av.getAlignment().getWidth(); - int alheight = av.getAlignment().getAbsoluteHeight(); - - // sampleCol or sampleRow is the width/height allocated to each residue - // in particular, sometimes we may need more than one row/col of the - // BufferedImage allocated - // sampleCol is how much of a residue to assign to each pixel - // sampleRow is how many sequences to assign to each pixel - float sampleCol = alwidth / (float) od.getWidth(); - float sampleRow = alheight / (float) od.getSequencesHeight(); - - buildImage(sampleRow, sampleCol); -======= - float sampleCol = (float) alwidth / (float) width; - float sampleRow = (float) alheight / (float) sequencesHeight; - - int lastcol = -1, lastrow = -1; - Color color = Color.white; - int row, col; - jalview.datamodel.SequenceI seq; - final boolean hasHiddenRows = av.hasHiddenRows(), hasHiddenCols = av - .hasHiddenColumns(); - boolean hiddenRow = false; - // get hidden row and hidden column map once at beginning. - // clone featureRenderer settings to avoid race conditions... if state is - // updated just need to refresh again - - FeatureColourFinder finder = new FeatureColourFinder(fr); - - for (row = 0; row < sequencesHeight; row++) - { - if (resizeAgain) - { - break; - } - if ((int) (row * sampleRow) == lastrow) - { - // No need to recalculate the colours, - // Just copy from the row above - for (col = 0; col < width; col++) - { - if (resizeAgain) - { - break; - } - miniMe.setRGB(col, row, miniMe.getRGB(col, row - 1)); - } - continue; - } - - lastrow = (int) (row * sampleRow); - - hiddenRow = false; - if (hasHiddenRows) - { - seq = av.getAlignment().getHiddenSequences() - .getHiddenSequence(lastrow); - if (seq == null) - { - int index = av.getAlignment().getHiddenSequences() - .findIndexWithoutHiddenSeqs(lastrow); - - seq = av.getAlignment().getSequenceAt(index); - } - else - { - hiddenRow = true; - } - } - else - { - seq = av.getAlignment().getSequenceAt(lastrow); - } - - if (seq == null) - { - System.out.println(lastrow + " null"); - continue; - } - - for (col = 0; col < width; col++) - { - if (resizeAgain) - { - break; - } - if ((int) (col * sampleCol) == lastcol - && (int) (row * sampleRow) == lastrow) - { - miniMe.setRGB(col, row, color.getRGB()); - continue; - } - - lastcol = (int) (col * sampleCol); - - if (seq.getLength() > lastcol) - { - color = sr.getResidueColour(seq, lastcol, finder); - } - else - { - color = Color.WHITE; - } - - if (hiddenRow - || (hasHiddenCols && !av.getColumnSelection().isVisible( - lastcol))) - { - color = color.darker().darker(); - } - - miniMe.setRGB(col, row, color.getRGB()); ->>>>>>> bug/JAL-2436featureRendererThreading - - if (av.isShowAnnotation()) - { - renderer.updateFromAlignViewport(av); - for (int col = 0; col < od.getWidth() && !resizeAgain; col++) - { - mg.translate(col, od.getSequencesHeight()); - renderer.drawGraph(mg, av.getAlignmentConservationAnnotation(), - av.getAlignmentConservationAnnotation().annotations, - (int) (sampleCol) + 1, od.getGraphHeight(), - (int) (col * sampleCol), (int) (col * sampleCol) + 1); - mg.translate(-col, -od.getSequencesHeight()); - - } - } - System.gc(); - - resizing = false; - - if (resizeAgain) - { - resizeAgain = false; - updateOverviewImage(); - } - else - { - lastMiniMe = miniMe; - } - - setBoxPosition(); - } - - /* - * Build the overview panel image - */ - private void buildImage(float sampleRow, float sampleCol) - { - int lastcol = -1; - int lastrow = -1; - int color = Color.white.getRGB(); - - SequenceI seq = null; - - final boolean hasHiddenCols = av.hasHiddenColumns(); - boolean hiddenRow = false; - // get hidden row and hidden column map once at beginning. - // clone featureRenderer settings to avoid race conditions... if state is - // updated just need to refresh again - for (int row = 0; row < od.getSequencesHeight() && !resizeAgain; row++) - { - boolean doCopy = true; - int currentrow = (int) (row * sampleRow); - if (currentrow != lastrow) - { - doCopy = false; - - lastrow = currentrow; - - // get the sequence which would be at alignment index 'lastrow' if no - // rows were hidden, and determine whether it is hidden or not - hiddenRow = av.getAlignment().isHidden(lastrow); - seq = av.getAlignment().getSequenceAtAbsoluteIndex(lastrow); - } - - for (int col = 0; col < od.getWidth() && !resizeAgain; col++) - { - if (doCopy) - { - color = miniMe.getRGB(col, row - 1); - } - else if ((int) (col * sampleCol) != lastcol - || (int) (row * sampleRow) != lastrow) - { - lastcol = (int) (col * sampleCol); - color = getColumnColourFromSequence(seq, hiddenRow, hasHiddenCols, - lastcol); - } - // else we just use the color we already have , so don't need to set it - - miniMe.setRGB(col, row, color); - } - } - } - - /* - * Find the colour of a sequence at a specified column position - */ - private int getColumnColourFromSequence(jalview.datamodel.SequenceI seq, - boolean hiddenRow, boolean hasHiddenCols, int lastcol) - { - int color; - - if (seq == null) - { - color = Color.white.getRGB(); - } - else if (seq.getLength() > lastcol) - { - color = sr.getResidueBoxColour(seq, lastcol).getRGB(); - - if (av.isShowSequenceFeatures()) - { - color = fr.findFeatureColour(color, seq, lastcol); - } - } - else - { - color = Color.white.getRGB(); - } - - if (hiddenRow - || (hasHiddenCols && !av.getColumnSelection() - .isVisible(lastcol))) - { - color = new Color(color).darker().darker().getRGB(); - } - - return color; - } - - /** - * Update the overview panel box when the associated alignment panel is - * changed - * - */ - public void setBoxPosition() - { - od.setBoxPosition(av.getAlignment() - .getHiddenSequences(), av.getColumnSelection(), av.getRanges()); - repaint(); - } - - - @Override - public void paintComponent(Graphics g) - { - if (resizing || resizeAgain) - { - if (lastMiniMe == null) - { - g.setColor(Color.white); - g.fillRect(0, 0, getWidth(), getHeight()); - } - else - { - g.drawImage(lastMiniMe, 0, 0, getWidth(), getHeight(), this); - } - g.setColor(TRANS_GREY); - g.fillRect(0, 0, getWidth(), getHeight()); - } - else if (lastMiniMe != null) - { - g.drawImage(lastMiniMe, 0, 0, this); - if (lastMiniMe != miniMe) - { - g.setColor(TRANS_GREY); - g.fillRect(0, 0, getWidth(), getHeight()); - } - } - - g.setColor(Color.red); - od.drawBox(g); - } -}