JAL-3541 selectively merged build.gradle and gradle.properties
[jalview.git] / srcjar / fr / orsay / lri / varna / components / ZoomWindow.java
diff --git a/srcjar/fr/orsay/lri/varna/components/ZoomWindow.java b/srcjar/fr/orsay/lri/varna/components/ZoomWindow.java
new file mode 100644 (file)
index 0000000..4003e69
--- /dev/null
@@ -0,0 +1,185 @@
+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
+               
+       }
+       
+}