package fr.orsay.lri.varna.components; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.GeneralPath; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.geom.Point2D.Double; import java.awt.image.BufferedImage; import java.awt.image.ImageObserver; import javax.swing.JPanel; import fr.orsay.lri.varna.VARNAPanel; import fr.orsay.lri.varna.models.export.SwingGraphics; import fr.orsay.lri.varna.models.export.VueVARNAGraphics; public class ZoomWindow extends JPanel implements ImageObserver, Runnable, MouseMotionListener, MouseListener { VARNAPanel _vp = null; BufferedImage _bi = null; Rectangle2D.Double rnaRect = null; public ZoomWindow(VARNAPanel vp) { _vp = vp; addMouseMotionListener(this); addMouseListener(this); } public synchronized void setPanel(VARNAPanel vp) { _vp = vp; } public synchronized void drawPanel() { if (getWidth()>0 && getHeight()>0) { _bi= new BufferedImage(getWidth(),getHeight(),BufferedImage.TYPE_4BYTE_ABGR); Graphics2D g2 = _bi.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); VueVARNAGraphics g2D = new SwingGraphics(g2); rnaRect =_vp.renderRNA(g2D,new Rectangle2D.Double(0,0,getWidth(),getHeight()),false,true); Point2D.Double p1 = _vp.panelToLogicPoint(new Point2D.Double(0.,0.)); Point2D.Double p2 = _vp.panelToLogicPoint(new Point2D.Double(_vp.getWidth(),_vp.getHeight())); double w = p2.x-p1.x; double h = p2.y-p1.y; Rectangle2D.Double rnaBox = _vp.getRNA().getBBox(); double ratiox = w/rnaBox.width; double ratioy = h/rnaBox.height; Rectangle2D.Double rvisible = new Rectangle2D.Double(rnaRect.x+rnaRect.width*(double)(p1.x-rnaBox.x)/(double)rnaBox.width, rnaRect.y+rnaRect.height*(double)(p1.y-rnaBox.y)/(double)rnaBox.height, ratiox*rnaRect.width, ratioy*rnaRect.height); //g2D.drawRect(rleft.x,rleft.y,rleft.width,rleft.height); Color shade = new Color(.9f,.9f,.9f,.4f); g2.setStroke(new BasicStroke(1.0f)); g2.setColor(shade); /*Polygon north = new Polygon(new int[]{0,getWidth(),(int)rvisible.x, (int)(rvisible.x+rvisible.width+1),},new int[]{},1);*/ g2.fillRect(0,0,getWidth(),(int)rvisible.y); g2.fillRect(0,(int)rvisible.y,(int)rvisible.x,(int)rvisible.height+1); g2.fillRect((int)(rvisible.x+rvisible.width),(int)rvisible.y,(int)(getHeight()-(rvisible.x+rvisible.width)),(int)(rvisible.height+1)); g2.fillRect(0,(int)(rvisible.y+rvisible.height),getWidth(),(int)(getHeight()-(rvisible.y+rvisible.height))); g2.setColor(new Color(.7f,.7f,.7f,.3f)); g2.draw(rvisible); g2.drawLine(0, 0, (int)rvisible.x, (int)rvisible.y); g2D.drawLine(getWidth(), 0, rvisible.x+rvisible.width, rvisible.y); g2D.drawLine(getWidth(), getHeight(), rvisible.x+rvisible.width, rvisible.y+rvisible.height); g2D.drawLine(0, getHeight(), rvisible.x, rvisible.y+rvisible.height); g2.dispose(); } } public void paintComponent(Graphics g) { setBackground(_vp.getBackground()); super.paintComponent(g); drawPanel(); if (_bi!=null) { g.drawImage(_bi,0,0,this); } } public void run() { while(true) { repaint(); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } public void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub } public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub } public void mouseClicked(MouseEvent e) { /*if (rnaRect!=null) { int x= e.getX(); int y= e.getY(); double ratioX = ((double)(x-rnaRect.getMinX())/((double)rnaRect.width)); double ratioY = ((double)(y-rnaRect.getMinY())/((double)rnaRect.height)); _vp.centerViewOn(ratioX,ratioY ); }*/ } public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } }