Export annotations as Jalview format
[jalview.git] / src / jalview / gui / AnnotationLabels.java
index 560c983..5667f84 100755 (executable)
@@ -40,15 +40,15 @@ 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
@@ -108,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
@@ -128,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
@@ -173,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
@@ -200,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
@@ -210,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
@@ -221,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
@@ -231,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
@@ -243,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
@@ -271,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
@@ -280,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
@@ -294,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
@@ -363,6 +391,7 @@ public class AnnotationLabels extends JPanel implements MouseListener,
          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
@@ -390,8 +419,11 @@ public class AnnotationLabels extends JPanel implements MouseListener,
         g.setColor(Color.black);\r
 \r
         AlignmentAnnotation[] aa = av.alignment.getAlignmentAnnotation();\r
-        int y = g.getFont().getSize();\r
+        int fontHeight = g.getFont().getSize();\r
+        int y = fontHeight;\r
         int x = 0;\r
+        int graphExtras = 0;\r
+\r
 \r
 \r
         if (aa != null)\r
@@ -407,13 +439,71 @@ public class AnnotationLabels extends JPanel implements MouseListener,
 \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].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
@@ -423,13 +513,16 @@ 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