package jalview.gui; import javax.swing.*; import java.awt.event.*; import java.awt.image.*; import java.awt.*; public class OverviewPanel extends JPanel { BufferedImage miniMe; AlignViewport av; AlignmentPanel ap; float scalew = 1f; float scaleh = 1f; int sequencesWidth, sequencesHeight; int graphHeight=30; int boxX=-1, boxY=-1, boxWidth=-1, boxHeight=-1; public OverviewPanel(AlignmentPanel ap, AlignViewport av) { this.av = av; this.ap = ap; // scale the initial size of overviewpanel to shape of alignment float initialScale = (float)av.getAlignment().getWidth()/(float)av.getAlignment().getHeight(); if(av.getAlignment().getWidth() > av.getAlignment().getHeight()) { // wider sequencesWidth = 400; sequencesHeight = (int)(400f/initialScale); } else { // taller sequencesWidth = (int)(400f*initialScale); sequencesHeight = 300; } setSize(sequencesWidth, sequencesHeight+graphHeight); setLayout(null); updateOverviewImage(); addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent evt) { if( getWidth()!=sequencesWidth || getHeight()!=sequencesHeight+graphHeight) updateOverviewImage(); } }); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent evt) { doMouseDragged(evt);} }); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent evt) { doMousePressed(evt);} public void mouseReleased(MouseEvent evt) { doMouseReleased(evt);} }); } public void doMousePressed(MouseEvent evt) { checkValid(evt.getX(), evt.getY()); repaint(); } public void doMouseReleased(MouseEvent evt) { int x = evt.getX(); int y = evt.getY(); checkValid(x, y); ap.setScrollValues( (int)(x/scalew/av.getCharWidth()), (int)(y/scaleh/av.getCharHeight()) ); } public void doMouseDragged(MouseEvent evt) { int x = evt.getX(); int y = evt.getY(); checkValid(x, y); ap.setScrollValues( (int)(x/scalew/av.getCharWidth()), (int)(y/scaleh/av.getCharHeight()) ); repaint(); } void checkValid(int x, int y) { if (y < 0) y = 0; if (y > sequencesHeight - boxHeight) y = sequencesHeight- boxHeight; if (x < 0) x = 0; if (x > sequencesWidth - boxWidth) x = sequencesWidth - boxWidth; boxX = x; boxY = y; } public void updateOverviewImage() { boolean oldRenderGaps = av.renderGaps; av.setRenderGaps(false); miniMe = null; setPreferredSize (new Dimension(sequencesWidth, sequencesHeight+graphHeight)); sequencesWidth=getWidth(); sequencesHeight=this.getHeight()-graphHeight; int fullsizeWidth = av.getAlignment().getWidth() * av.getCharWidth(); int fullsizeHeight = av.getAlignment().getHeight()* av.getCharHeight(); BufferedImage fullSize = new BufferedImage(fullsizeWidth, fullsizeHeight, BufferedImage.TYPE_INT_RGB); BufferedImage consensus = new BufferedImage(fullsizeWidth, 60, BufferedImage.TYPE_INT_RGB); Graphics g = fullSize.getGraphics(); ap.seqPanel.seqCanvas.drawPanel(g,0,av.getAlignment().getWidth(),0,av.getAlignment().getHeight(),0,0,0); g = consensus.getGraphics(); ap.annotationPanel.drawGraph(g, av.conservation, fullsizeWidth, 60); try{ miniMe = new BufferedImage(sequencesWidth, sequencesHeight + graphHeight, BufferedImage.TYPE_INT_RGB); Graphics mg = miniMe.getGraphics(); mg.drawImage(fullSize, 0, 0, sequencesWidth, sequencesHeight, 0, 0, fullsizeWidth, fullsizeHeight, this); mg.drawImage(consensus, 0, sequencesHeight, sequencesWidth, sequencesHeight + graphHeight, 0, 0, fullsizeWidth, 60, this); scalew = (float) sequencesWidth / (float) fullsizeWidth; scaleh = (float) sequencesHeight / (float) fullsizeHeight; setBoxPosition(); }catch(Exception ex) {// most likely the frame size is zero miniMe = null; } av.setRenderGaps(oldRenderGaps); } public void setBoxPosition() { boxX = (int) (av.getStartRes() * av.getCharWidth() * scalew); boxY = (int) (av.getStartSeq() * av.getCharHeight() * scaleh); boxWidth = (int) (av.getEndRes() * av.getCharWidth() * scalew) - boxX; boxHeight = (int) (av.getEndSeq() * av.getCharHeight() * scaleh) - boxY; repaint(); } public void paintComponent(Graphics g) { g.setColor(Color.white); g.fillRect(0,0,getWidth(),getHeight()); if(miniMe!=null) g.drawImage(miniMe, 0,0,this); g.setColor(Color.red); g.drawRect(boxX, boxY, boxWidth, boxHeight); g.drawRect(boxX+1, boxY+1, boxWidth-2, boxHeight-2); } }