Formatting
[jalview.git] / src / jalview / gui / RotatableCanvas.java
index 6ae66a2..32c4adc 100755 (executable)
@@ -1,6 +1,6 @@
 /*\r
  * Jalview - A Sequence Alignment Editor and Viewer\r
- * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
  *\r
  * This program is free software; you can redistribute it and/or\r
  * modify it under the terms of the GNU General Public License\r
@@ -26,13 +26,16 @@ import javax.swing.*;
 \r
 import jalview.datamodel.*;\r
 import jalview.math.*;\r
-import jalview.util.*;\r
 \r
+/**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @author $author$\r
+ * @version $Revision$\r
+ */\r
 public class RotatableCanvas\r
     extends JPanel implements MouseListener,\r
     MouseMotionListener, KeyListener\r
-//RubberbandListener,\r
-//SequenceSelectionListener\r
 {\r
   RotatableMatrix idmat = new RotatableMatrix(3, 3);\r
   RotatableMatrix objmat = new RotatableMatrix(3, 3);\r
@@ -67,17 +70,51 @@ public class RotatableCanvas
   int recty2;\r
   float scalefactor = 1;\r
   AlignViewport av;\r
+  AlignmentPanel ap;\r
+  boolean showLabels = false;\r
+  Color bgColour = Color.black;\r
+  boolean applyToAllViews = false;\r
 \r
   //  Controller    controller;\r
-  public RotatableCanvas(AlignViewport av, Vector points, int npoint)\r
+  public RotatableCanvas(AlignmentPanel ap)\r
+  {\r
+    this.av = ap.av;\r
+    this.ap = ap;\r
+\r
+    addMouseWheelListener(new MouseWheelListener()\r
+    {\r
+      public void mouseWheelMoved(MouseWheelEvent e)\r
+      {\r
+        if (e.getWheelRotation() > 0)\r
+        {\r
+          scale = (float) (scale * 1.1);\r
+          repaint();\r
+        }\r
+\r
+        else\r
+        {\r
+          scale = (float) (scale * 0.9);\r
+          repaint();\r
+        }\r
+      }\r
+    });\r
+\r
+  }\r
+\r
+  public void showLabels(boolean b)\r
+  {\r
+    showLabels = b;\r
+    repaint();\r
+  }\r
+\r
+  public void setPoints(Vector points, int npoint)\r
   {\r
     this.points = points;\r
     this.npoint = npoint;\r
-    this.av = av;\r
     ToolTipManager.sharedInstance().registerComponent(this);\r
-    PaintRefresher.Register(this, av.alignment);\r
+    ToolTipManager.sharedInstance().setInitialDelay(0);\r
+    ToolTipManager.sharedInstance().setDismissDelay(10000);\r
 \r
-    //\r
     prefsize = getPreferredSize();\r
     orig = new float[npoint][3];\r
 \r
@@ -119,31 +156,12 @@ public class RotatableCanvas
 \r
     scale = findScale();\r
 \r
-    //    System.out.println("Scale factor = " + scale);\r
     addMouseListener(this);\r
-    addKeyListener(this);\r
 \r
-    // if (getParent() != null) {\r
-    //   getParent().addKeyListener(this);\r
-    //}\r
     addMouseMotionListener(this);\r
 \r
-    // Add rubberband\r
-    //   rubberband  = new RubberbandRectangle(this);\r
-    //  rubberband.setActive(true);\r
-    //   rubberband.addListener(this);\r
   }\r
 \r
-  /* public boolean handleSequenceSelectionEvent(SequenceSelectionEvent evt) {\r
-     redrawneeded = true;\r
-     repaint();\r
-     return true;\r
-   }\r
-\r
-   public void removeNotify() {\r
-     controller.removeListener(this);\r
-     super.removeNotify();\r
-   }*/\r
   public void initAxes()\r
   {\r
     for (int i = 0; i < 3; i++)\r
@@ -162,6 +180,9 @@ public class RotatableCanvas
     }\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   */\r
   public void findWidth()\r
   {\r
     max = new float[3];\r
@@ -215,6 +236,11 @@ public class RotatableCanvas
     //System.out.println("Maxwidth = " + maxwidth);\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @return DOCUMENT ME!\r
+   */\r
   public float findScale()\r
   {\r
     int dim;\r
@@ -244,6 +270,9 @@ public class RotatableCanvas
     return (float) ( (dim * scalefactor) / (2 * maxwidth));\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   */\r
   public void findCentre()\r
   {\r
     //Find centre coordinate\r
@@ -258,6 +287,11 @@ public class RotatableCanvas
     //System.out.println("Centre z " + centre[2]);\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @return DOCUMENT ME!\r
+   */\r
   public Dimension getPreferredSize()\r
   {\r
     if (prefsize != null)\r
@@ -270,40 +304,69 @@ public class RotatableCanvas
     }\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @return DOCUMENT ME!\r
+   */\r
   public Dimension getMinimumSize()\r
   {\r
     return getPreferredSize();\r
   }\r
 \r
-  public void paintComponent(Graphics g)\r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param g DOCUMENT ME!\r
+   */\r
+  public void paintComponent(Graphics g1)\r
   {\r
-    //Only create the image at the beginning -\r
-    if ( (img == null) || (prefsize.width != getWidth()) ||\r
-        (prefsize.height != getHeight()))\r
-    {\r
-      prefsize.width = getWidth();\r
-      prefsize.height = getHeight();\r
 \r
-      scale = findScale();\r
+    Graphics2D g = (Graphics2D) g1;\r
 \r
-      //      System.out.println("New scale = " + scale);\r
-      img = createImage(getWidth(), getHeight());\r
-      ig = img.getGraphics();\r
+    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
+                       RenderingHints.VALUE_ANTIALIAS_ON);\r
+    if (points == null)\r
+    {\r
+      g.setFont(new Font("Verdana", Font.PLAIN, 18));\r
+      g.drawString("Calculating PCA....", 20, getHeight() / 2);\r
     }\r
+    else\r
+    {\r
+      //Only create the image at the beginning -\r
+      if ( (img == null) || (prefsize.width != getWidth()) ||\r
+          (prefsize.height != getHeight()))\r
+      {\r
+        prefsize.width = getWidth();\r
+        prefsize.height = getHeight();\r
 \r
-    drawBackground(ig, Color.black);\r
-    drawScene(ig);\r
+        scale = findScale();\r
 \r
-    if (drawAxes == true)\r
-    {\r
-      drawAxes(ig);\r
-    }\r
+        //      System.out.println("New scale = " + scale);\r
+        img = createImage(getWidth(), getHeight());\r
+        ig = img.getGraphics();\r
+      }\r
 \r
-    g.drawImage(img, 0, 0, this);\r
+      drawBackground(ig, bgColour);\r
+      drawScene(ig);\r
+\r
+      if (drawAxes == true)\r
+      {\r
+        drawAxes(ig);\r
+      }\r
+\r
+      g.drawImage(img, 0, 0, this);\r
+    }\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param g DOCUMENT ME!\r
+   */\r
   public void drawAxes(Graphics g)\r
   {\r
+\r
     g.setColor(Color.yellow);\r
 \r
     for (int i = 0; i < 3; i++)\r
@@ -314,15 +377,30 @@ public class RotatableCanvas
     }\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param g DOCUMENT ME!\r
+   * @param col DOCUMENT ME!\r
+   */\r
   public void drawBackground(Graphics g, Color col)\r
   {\r
     g.setColor(col);\r
     g.fillRect(0, 0, prefsize.width, prefsize.height);\r
   }\r
 \r
-  public void drawScene(Graphics g)\r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param g DOCUMENT ME!\r
+   */\r
+  public void drawScene(Graphics g1)\r
   {\r
-    boolean darker = false;\r
+\r
+    Graphics2D g = (Graphics2D) g1;\r
+\r
+    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
+                       RenderingHints.VALUE_ANTIALIAS_ON);\r
 \r
     int halfwidth = getWidth() / 2;\r
     int halfheight = getHeight() / 2;\r
@@ -336,18 +414,18 @@ public class RotatableCanvas
           halfheight;\r
       float z = sp.coord[1] - centre[2];\r
 \r
-      if (sp.sequence.getColor() == Color.black)\r
+      if (av.getSequenceColour(sp.sequence) == Color.black)\r
       {\r
         g.setColor(Color.white);\r
       }\r
       else\r
       {\r
-        g.setColor(sp.sequence.getColor());\r
+        g.setColor(av.getSequenceColour(sp.sequence));\r
       }\r
 \r
       if (av.getSelectionGroup() != null)\r
       {\r
-        if (av.getSelectionGroup().sequences.contains(\r
+        if (av.getSelectionGroup().getSequences(null).contains(\r
             ( (SequencePoint) points.elementAt(i)).sequence))\r
         {\r
           g.setColor(Color.gray);\r
@@ -360,7 +438,13 @@ public class RotatableCanvas
       }\r
 \r
       g.fillRect(x - 3, y - 3, 6, 6);\r
-      g.setColor(Color.red);\r
+      if (showLabels)\r
+      {\r
+        g.setColor(Color.red);\r
+        g.drawString( ( (SequencePoint) points.elementAt(i)).sequence.\r
+                     getName(),\r
+                     x - 3, y - 4);\r
+      }\r
     }\r
 \r
     //    //Now the rectangle\r
@@ -371,28 +455,51 @@ public class RotatableCanvas
     //    }\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @return DOCUMENT ME!\r
+   */\r
   public Dimension minimumsize()\r
   {\r
     return prefsize;\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @return DOCUMENT ME!\r
+   */\r
   public Dimension preferredsize()\r
   {\r
     return prefsize;\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param evt DOCUMENT ME!\r
+   */\r
   public void keyTyped(KeyEvent evt)\r
   {\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param evt DOCUMENT ME!\r
+   */\r
   public void keyReleased(KeyEvent evt)\r
   {\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param evt DOCUMENT ME!\r
+   */\r
   public void keyPressed(KeyEvent evt)\r
   {\r
-    requestFocus();\r
-\r
     if (evt.getKeyCode() == KeyEvent.VK_UP)\r
     {\r
       scalefactor = (float) (scalefactor * 1.1);\r
@@ -416,38 +523,47 @@ public class RotatableCanvas
     repaint();\r
   }\r
 \r
-  public void printPoints()\r
-  {\r
-    for (int i = 0; i < npoint; i++)\r
-    {\r
-      SequencePoint sp = (SequencePoint) points.elementAt(i);\r
-      Format.print(System.out, "%5d ", i);\r
-\r
-      for (int j = 0; j < 3; j++)\r
-      {\r
-        Format.print(System.out, "%13.3f  ", sp.coord[j]);\r
-      }\r
-\r
-      System.out.println();\r
-    }\r
-  }\r
-\r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param evt DOCUMENT ME!\r
+   */\r
   public void mouseClicked(MouseEvent evt)\r
   {\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param evt DOCUMENT ME!\r
+   */\r
   public void mouseEntered(MouseEvent evt)\r
   {\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param evt DOCUMENT ME!\r
+   */\r
   public void mouseExited(MouseEvent evt)\r
   {\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param evt DOCUMENT ME!\r
+   */\r
   public void mouseReleased(MouseEvent evt)\r
   {\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param evt DOCUMENT ME!\r
+   */\r
   public void mousePressed(MouseEvent evt)\r
   {\r
     int x = evt.getX();\r
@@ -472,17 +588,24 @@ public class RotatableCanvas
 \r
     if (found != null)\r
     {\r
-      if (av.getSelectionGroup() != null)\r
-      {\r
-        av.getSelectionGroup().addOrRemove(found, true);\r
-        PaintRefresher.Refresh(this, av.alignment);\r
-      }\r
-      else\r
+      AlignmentPanel[] aps = getAssociatedPanels();\r
+\r
+      for (int a = 0; a < aps.length; a++)\r
       {\r
-        av.setSelectionGroup(new SequenceGroup());\r
-        av.getSelectionGroup().addOrRemove(found, true);\r
-        av.getSelectionGroup().setEndRes(av.alignment.getWidth());\r
+        if (aps[a].av.getSelectionGroup() != null)\r
+        {\r
+          aps[a].av.getSelectionGroup().addOrRemove(found, true);\r
+        }\r
+        else\r
+        {\r
+          aps[a].av.setSelectionGroup(new SequenceGroup());\r
+          aps[a].av.getSelectionGroup().addOrRemove(found, true);\r
+          aps[a].av.getSelectionGroup().setEndRes(\r
+              aps[a].av.alignment.getWidth() - 1);\r
+        }\r
       }\r
+\r
+      PaintRefresher.Refresh(this, av.getSequenceSetId());\r
     }\r
 \r
     repaint();\r
@@ -505,6 +628,11 @@ public class RotatableCanvas
     }\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param evt DOCUMENT ME!\r
+   */\r
   public void mouseDragged(MouseEvent evt)\r
   {\r
     mx = evt.getX();\r
@@ -551,10 +679,16 @@ public class RotatableCanvas
     }\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param x1 DOCUMENT ME!\r
+   * @param y1 DOCUMENT ME!\r
+   * @param x2 DOCUMENT ME!\r
+   * @param y2 DOCUMENT ME!\r
+   */\r
   public void rectSelect(int x1, int y1, int x2, int y2)\r
   {\r
-    boolean changedSel = false;\r
-\r
     for (int i = 0; i < npoint; i++)\r
     {\r
       SequencePoint sp = (SequencePoint) points.elementAt(i);\r
@@ -567,9 +701,8 @@ public class RotatableCanvas
       {\r
         if (av != null)\r
         {\r
-          if (!av.getSelectionGroup().sequences.contains(sp.sequence))\r
+          if (!av.getSelectionGroup().getSequences(null).contains(sp.sequence))\r
           {\r
-            changedSel = true;\r
             av.getSelectionGroup().addSequence(sp.sequence, true);\r
           }\r
         }\r
@@ -581,6 +714,14 @@ public class RotatableCanvas
     // }\r
   }\r
 \r
+  /**\r
+   * DOCUMENT ME!\r
+   *\r
+   * @param x DOCUMENT ME!\r
+   * @param y DOCUMENT ME!\r
+   *\r
+   * @return DOCUMENT ME!\r
+   */\r
   public SequenceI findPoint(int x, int y)\r
   {\r
     int halfwidth = getWidth() / 2;\r
@@ -612,25 +753,17 @@ public class RotatableCanvas
     }\r
   }\r
 \r
-  /*  public boolean handleRubberbandEvent(RubberbandEvent evt) {\r
-      System.out.println("Rubberband handler called in RotatableCanvas with " +\r
-                         evt.getBounds());\r
-\r
-      Rubberband rb = (Rubberband)evt.getSource();\r
-\r
-      // Clear the current selection (instance variable)\r
-      //if ((rb.getModifiers() & Event.SHIFT_MASK) == 0) {\r
-      //   clearSelection();\r
-      //}\r
-\r
-      if (rb.getComponent() == this) {\r
-        Rectangle bounds = evt.getBounds();\r
-   rectSelect(bounds.x,bounds.y,bounds.x+bounds.width,bounds.y+bounds.height);\r
-      }\r
-\r
-      redrawneeded = true;\r
-      paint(this.getGraphics());\r
-\r
-      return true;\r
-    }*/\r
+  AlignmentPanel[] getAssociatedPanels()\r
+  {\r
+    if (applyToAllViews)\r
+    {\r
+      return PaintRefresher.getAssociatedPanels(av.getSequenceSetId());\r
+    }\r
+    else\r
+    {\r
+      return new AlignmentPanel[]\r
+          {\r
+          ap};\r
+    }\r
+  }\r
 }\r