Export annotations as Jalview format
[jalview.git] / src / jalview / gui / AnnotationLabels.java
index c21f370..5667f84 100755 (executable)
@@ -40,15 +40,18 @@ public class AnnotationLabels extends JPanel implements MouseListener,
     static String HIDE = "Hide This Row";\r
     static String DELETE = "Delete This Row";\r
     static String SHOWALL = "Show All Hidden Rows";\r
-    static String OUTPUT_TEXT = "Show Values In Textbox";\r
-    boolean active = false;\r
+    static String OUTPUT_TEXT = "Export Annotation";\r
+    boolean resizePanel = false;\r
     Image image;\r
     AlignmentPanel ap;\r
+    AlignViewport av;\r
     boolean resizing = false;\r
+    MouseEvent dragEvent;\r
     int oldY;\r
-    int mouseX;\r
-    int selectedRow = 0;\r
+    int selectedRow;\r
     int scrollOffset = 0;\r
+    Font font = new Font("Arial", Font.PLAIN, 11);\r
+\r
 \r
     /**\r
      * Creates a new AnnotationLabels object.\r
@@ -58,6 +61,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
     public AnnotationLabels(AlignmentPanel ap)\r
     {\r
         this.ap = ap;\r
+        av = ap.av;\r
 \r
         java.net.URL url = getClass().getResource("/images/idwidth.gif");\r
         Image temp = null;\r
@@ -88,6 +92,11 @@ public class AnnotationLabels extends JPanel implements MouseListener,
         addMouseMotionListener(this);\r
     }\r
 \r
+    public AnnotationLabels(AlignViewport av)\r
+    {\r
+      this.av = av;\r
+    }\r
+\r
     /**\r
      * DOCUMENT ME!\r
      *\r
@@ -99,6 +108,29 @@ public class AnnotationLabels extends JPanel implements MouseListener,
         repaint();\r
     }\r
 \r
+    void getSelectedRow(int y)\r
+    {\r
+      int height = 0;\r
+      AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
+\r
+      for (int i = 0; i < aa.length; i++)\r
+      {\r
+        if (!aa[i].visible)\r
+        {\r
+          continue;\r
+        }\r
+\r
+        height += aa[i].height;\r
+\r
+        if (y < height)\r
+        {\r
+          selectedRow = i;\r
+\r
+          break;\r
+        }\r
+      }\r
+    }\r
+\r
     /**\r
      * DOCUMENT ME!\r
      *\r
@@ -119,10 +151,12 @@ public class AnnotationLabels extends JPanel implements MouseListener,
                 label = "";\r
             }\r
 \r
-            ap.av.alignment.addAnnotation(new AlignmentAnnotation(label,\r
+            AlignmentAnnotation newAnnotation = new AlignmentAnnotation(label,\r
                     "New description",\r
-                    new Annotation[ap.av.alignment.getWidth()]));\r
+                    new Annotation[ap.av.alignment.getWidth()]);\r
 \r
+            ap.av.alignment.addAnnotation(newAnnotation);\r
+            ap.av.alignment.setAnnotationIndex(newAnnotation, 0);\r
             dif = aa[aa.length - 1].height;\r
         }\r
         else if (evt.getActionCommand().equals(HIDE))\r
@@ -164,24 +198,17 @@ public class AnnotationLabels extends JPanel implements MouseListener,
         }\r
         else if (evt.getActionCommand().equals(OUTPUT_TEXT))\r
         {\r
-            CutAndPasteTransfer cap = new CutAndPasteTransfer();\r
-            Desktop.addInternalFrame(cap,\r
-                ap.alignFrame.getTitle() + " - " + aa[selectedRow].label, 500,\r
-                100);\r
-            cap.setText(aa[selectedRow].toString());\r
+          new AnnotationExporter().exportAnnotations(\r
+              ap,\r
+              new AlignmentAnnotation[]\r
+              {aa[selectedRow]}\r
+              );\r
         }\r
 \r
 \r
         ap.annotationPanel.adjustPanelHeight();\r
-\r
-        Dimension d = ap.annotationScroller.getPreferredSize();\r
-        ap.annotationScroller.setPreferredSize(new Dimension(d.width,\r
-                d.height + dif));\r
-        d = ap.annotationSpaceFillerHolder.getPreferredSize();\r
-        ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(d.width,\r
-                d.height + dif));\r
-\r
-        ap.addNotify();\r
+        ap.annotationScroller.validate();\r
+        ap.repaint();\r
     }\r
 \r
     /**\r
@@ -191,6 +218,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
      */\r
     public void mousePressed(MouseEvent evt)\r
     {\r
+        getSelectedRow(evt.getY() - scrollOffset);\r
         oldY = evt.getY();\r
     }\r
 \r
@@ -201,8 +229,25 @@ public class AnnotationLabels extends JPanel implements MouseListener,
      */\r
     public void mouseReleased(MouseEvent evt)\r
     {\r
-        active = false;\r
+        int start = selectedRow;\r
+        getSelectedRow(evt.getY() - scrollOffset);\r
+        int end = selectedRow;\r
+\r
+        if(start!=end)\r
+        {\r
+          //Swap these annotations\r
+          AlignmentAnnotation startAA = ap.av.alignment.getAlignmentAnnotation()[start];\r
+          AlignmentAnnotation endAA = ap.av.alignment.getAlignmentAnnotation()[end];\r
+\r
+\r
+          ap.av.alignment.getAlignmentAnnotation()[end] = startAA;\r
+          ap.av.alignment.getAlignmentAnnotation()[start] = endAA;\r
+        }\r
+\r
+        resizePanel = false;\r
+        dragEvent = null;\r
         repaint();\r
+        ap.annotationPanel.repaint();\r
     }\r
 \r
     /**\r
@@ -212,8 +257,11 @@ public class AnnotationLabels extends JPanel implements MouseListener,
      */\r
     public void mouseEntered(MouseEvent evt)\r
     {\r
-        active = true;\r
+      if(evt.getY()<10)\r
+      {\r
+        resizePanel = true;\r
         repaint();\r
+      }\r
     }\r
 \r
     /**\r
@@ -222,10 +270,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
      * @param evt DOCUMENT ME!\r
      */\r
     public void mouseExited(MouseEvent evt)\r
-    {\r
-        active = false;\r
-        repaint();\r
-    }\r
+    {       }\r
 \r
     /**\r
      * DOCUMENT ME!\r
@@ -234,25 +279,30 @@ public class AnnotationLabels extends JPanel implements MouseListener,
      */\r
     public void mouseDragged(MouseEvent evt)\r
     {\r
-        active = true;\r
+      dragEvent = evt;\r
 \r
+      if (resizePanel)\r
+      {\r
         Dimension d = ap.annotationScroller.getPreferredSize();\r
         int dif = evt.getY() - oldY;\r
 \r
         dif /= ap.av.charHeight;\r
         dif *= ap.av.charHeight;\r
 \r
-        if ((d.height - dif) > 20)\r
+        if ( (d.height - dif) > 20)\r
         {\r
-            ap.annotationScroller.setPreferredSize(new Dimension(d.width,\r
-                    d.height - dif));\r
-            d = ap.annotationSpaceFillerHolder.getPreferredSize();\r
-            ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(\r
-                    d.width, d.height - dif));\r
-            ap.repaint();\r
+          ap.annotationScroller.setPreferredSize(new Dimension(d.width,\r
+              d.height - dif));\r
+          d = ap.annotationSpaceFillerHolder.getPreferredSize();\r
+          ap.annotationSpaceFillerHolder.setPreferredSize(new Dimension(\r
+              d.width, d.height - dif));\r
+          ap.repaint();\r
         }\r
 \r
         ap.addNotify();\r
+      }\r
+      else\r
+        repaint();\r
     }\r
 \r
     /**\r
@@ -262,6 +312,9 @@ public class AnnotationLabels extends JPanel implements MouseListener,
      */\r
     public void mouseMoved(MouseEvent evt)\r
     {\r
+      resizePanel = evt.getY()<10;\r
+\r
+      repaint();\r
     }\r
 \r
     /**\r
@@ -271,7 +324,9 @@ public class AnnotationLabels extends JPanel implements MouseListener,
      */\r
     public void mouseClicked(MouseEvent evt)\r
     {\r
-        int y = evt.getY() - scrollOffset;\r
+       if(!SwingUtilities.isRightMouseButton(evt))\r
+         return;\r
+\r
         AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
 \r
         if ((aa == null) || (aa.length == 0))\r
@@ -285,24 +340,6 @@ public class AnnotationLabels extends JPanel implements MouseListener,
             return;\r
         }\r
 \r
-        int height = 0;\r
-\r
-        for (int i = 0; i < aa.length; i++)\r
-        {\r
-            if (!aa[i].visible)\r
-            {\r
-                continue;\r
-            }\r
-\r
-            height += aa[i].height;\r
-\r
-            if (y < height)\r
-            {\r
-                selectedRow = i;\r
-\r
-                break;\r
-            }\r
-        }\r
 \r
         JPopupMenu pop = new JPopupMenu("Annotations");\r
         JMenuItem item = new JMenuItem(ADDNEW);\r
@@ -325,7 +362,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
         {\r
           pop.addSeparator();\r
           final JCheckBoxMenuItem cbmi = new JCheckBoxMenuItem(\r
-              "Ignore gaps in consensus",\r
+              "Ignore Gaps In Consensus",\r
               ap.av.getIgnoreGapsConsensus());\r
           cbmi.addActionListener(new ActionListener()\r
               {public void actionPerformed(ActionEvent e)\r
@@ -346,13 +383,20 @@ public class AnnotationLabels extends JPanel implements MouseListener,
      *\r
      * @param g1 DOCUMENT ME!\r
      */\r
-    public void paintComponent(Graphics g1)\r
+    public void paintComponent(Graphics g)\r
     {\r
-        Graphics2D g = (Graphics2D) g1;\r
-        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
+\r
+        int width = getWidth();\r
+        if(width==0)\r
+         width = ap.calculateIdWidth().width + 4;\r
+\r
+       Graphics2D g2 = (Graphics2D) g;\r
+       if(av.antiAlias)\r
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\r
             RenderingHints.VALUE_ANTIALIAS_ON);\r
 \r
-        drawComponent(g);\r
+       drawComponent(g2, width);\r
+\r
     }\r
 \r
     /**\r
@@ -360,8 +404,13 @@ public class AnnotationLabels extends JPanel implements MouseListener,
      *\r
      * @param g DOCUMENT ME!\r
      */\r
-    public void drawComponent(Graphics2D g)\r
+    public void drawComponent(Graphics g, int width)\r
     {\r
+        if(av.getFont().getSize()<10)\r
+          g.setFont(new Font("Arial", Font.PLAIN, av.getFont().getSize()-1));\r
+        else\r
+          g.setFont(font);\r
+\r
         FontMetrics fm = g.getFontMetrics(g.getFont());\r
         g.setColor(Color.white);\r
         g.fillRect(0, 0, getWidth(), getHeight());\r
@@ -369,12 +418,13 @@ public class AnnotationLabels extends JPanel implements MouseListener,
         g.translate(0, scrollOffset);\r
         g.setColor(Color.black);\r
 \r
-        AlignmentAnnotation[] aa = ap.av.alignment.getAlignmentAnnotation();\r
-        int y = g.getFont().getSize();\r
+        AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();\r
+        int fontHeight = g.getFont().getSize();\r
+        int y = fontHeight;\r
         int x = 0;\r
-        int width = getWidth();\r
-        if(width==0)\r
-         width = ap.calculateIdWidth().width + 4;\r
+        int graphExtras = 0;\r
+\r
+\r
 \r
         if (aa != null)\r
         {\r
@@ -387,15 +437,73 @@ public class AnnotationLabels extends JPanel implements MouseListener,
 \r
                 x = width - fm.stringWidth(aa[i].label) - 3;\r
 \r
-                if (aa[i].isGraph)\r
+                if (aa[i].graph>0)\r
                 {\r
+                    graphExtras = y;\r
+\r
                     y += (aa[i].height / 3);\r
+\r
+                    if(aa[i].graphGroup<0)\r
+                        graphExtras = y + fontHeight;\r
                 }\r
 \r
-                g.drawString(aa[i].label, x, y);\r
+                if(aa[i].graphGroup>-1)\r
+                {\r
+                  int groupSize = 0;\r
+                  for (int gg = 0; gg < aa.length; gg++)\r
+                  {\r
+                    if (aa[gg].graphGroup == aa[i].graphGroup)\r
+                      groupSize++;\r
+                  }\r
+\r
+                  if(groupSize * (fontHeight+8) < aa[i].height)\r
+                    graphExtras += (aa[i].height -( groupSize * (fontHeight+8)) )/2;\r
+\r
+                 for(int gg=0; gg<aa.length; gg++)\r
+                 {\r
+                   if(aa[gg].graphGroup==aa[i].graphGroup)\r
+                   {\r
+                     x = width - fm.stringWidth(aa[gg].label) - 3;\r
+                     g.drawString(aa[gg].label, x, graphExtras );\r
+                     if(aa[gg].annotations[0]!=null)\r
+                       g.setColor(aa[gg].annotations[0].colour);\r
+\r
+                     g.drawLine( x, graphExtras+3,\r
+                                 x+fm.stringWidth(aa[gg].label),\r
+                                 graphExtras+3);\r
+\r
+                     g.setColor(Color.black);\r
+                     graphExtras += fontHeight+8;\r
+                   }\r
+                 }\r
+                }\r
+                else\r
+                  g.drawString(aa[i].label, x, y);\r
 \r
-                if (aa[i].isGraph)\r
+                if (aa[i].graph>0)\r
                 {\r
+                /*  if (aa[i].graphLines != null)\r
+                  {\r
+                    for (int gl = 0; gl < aa[i].graphLines.size(); gl++)\r
+                    {\r
+                       x = width - fm.stringWidth(aa[i].getGraphLine(gl).label) - 3;\r
+                      g.drawString(aa[i].getGraphLine(gl).label, x, graphExtras);\r
+                      g.setColor(aa[i].getGraphLine(gl).colour);\r
+                      Graphics2D g2 = (Graphics2D) g;\r
+                      g2.setStroke(new BasicStroke(1,\r
+                          BasicStroke.CAP_SQUARE,\r
+                          BasicStroke.JOIN_ROUND, 3f,\r
+                          new float[]\r
+                          {5f, 3f}, 0f));\r
+\r
+                      graphExtras += 3;\r
+\r
+                      g.drawLine(x, graphExtras,\r
+                                 x+fm.stringWidth(aa[i].label),\r
+                                 graphExtras);\r
+                      g2.setStroke(new BasicStroke());\r
+                    }\r
+                  }*/\r
                     y += ((2 * aa[i].height) / 3);\r
                 }\r
                 else\r
@@ -405,14 +513,17 @@ public class AnnotationLabels extends JPanel implements MouseListener,
             }\r
         }\r
 \r
-        if (active)\r
+        if (resizePanel)\r
         {\r
-            if (image != null)\r
-            {\r
-                g.drawImage(image, 2, 0, this);\r
-            }\r
+          g.drawImage(image, 2, 0 - scrollOffset, this);\r
+        }\r
+        else if (dragEvent != null)\r
+        {\r
+          g.setColor(Color.lightGray);\r
+          g.drawString(aa[selectedRow].label, dragEvent.getX(), dragEvent.getY() - scrollOffset);\r
         }\r
 \r
+\r
         if ((aa == null) || (aa.length < 1))\r
         {\r
             g.drawString("Right click", 2, 8);\r