Merge branch 'feature/JAL-2759' into merge/JAL-2759_2104
[jalview.git] / src / jalview / appletgui / AnnotationLabels.java
index 2786a08..bbcb3b8 100755 (executable)
@@ -1,37 +1,73 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
  * Jalview is free software: you can redistribute it and/or
  * modify it under the terms of the GNU General Public License 
- * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
  *  
  * Jalview is distributed in the hope that it will be useful, but 
  * WITHOUT ANY WARRANTY; without even the implied warranty 
  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
  * PURPOSE.  See the GNU General Public License for more details.
  * 
- * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
  * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.appletgui;
 
-import java.util.*;
-
-import java.awt.*;
-import java.awt.event.*;
-
-import jalview.datamodel.*;
+import jalview.analysis.AlignmentUtils;
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.HiddenColumns;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
 import jalview.util.MessageManager;
 import jalview.util.ParseHtmlBodyAndLinks;
 
-public class AnnotationLabels extends Panel implements ActionListener,
-        MouseListener, MouseMotionListener
+import java.awt.Checkbox;
+import java.awt.CheckboxMenuItem;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.FontMetrics;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.MenuItem;
+import java.awt.Panel;
+import java.awt.PopupMenu;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.util.Arrays;
+import java.util.Collections;
+
+public class AnnotationLabels extends Panel
+        implements ActionListener, MouseListener, MouseMotionListener
 {
   Image image;
 
+  /**
+   * width in pixels within which height adjuster arrows are shown and active
+   */
+  private static final int HEIGHT_ADJUSTER_WIDTH = 50;
+
+  /**
+   * height in pixels for allowing height adjuster to be active
+   */
+  private static int HEIGHT_ADJUSTER_HEIGHT = 10;
+
   boolean active = false;
 
   AlignmentPanel ap;
@@ -67,23 +103,6 @@ public class AnnotationLabels extends Panel implements ActionListener,
     this.ap = ap;
     this.av = ap.av;
     setLayout(null);
-
-    /**
-     * this retrieves the adjustable height glyph from resources. we don't use
-     * it at the moment. java.net.URL url =
-     * getClass().getResource("/images/idwidth.gif"); Image temp = null;
-     * 
-     * if (url != null) { temp =
-     * java.awt.Toolkit.getDefaultToolkit().createImage(url); }
-     * 
-     * try { MediaTracker mt = new MediaTracker(this); mt.addImage(temp, 0);
-     * mt.waitForID(0); } catch (Exception ex) { }
-     * 
-     * BufferedImage bi = new BufferedImage(temp.getHeight(this),
-     * temp.getWidth(this), BufferedImage.TYPE_INT_RGB); Graphics2D g =
-     * (Graphics2D) bi.getGraphics(); g.rotate(Math.toRadians(90));
-     * g.drawImage(temp, 0, -bi.getWidth(this), this); image = (Image) bi;
-     */
     addMouseListener(this);
     addMouseMotionListener(this);
   }
@@ -137,6 +156,7 @@ public class AnnotationLabels extends Panel implements ActionListener,
     return row;
   }
 
+  @Override
   public void actionPerformed(ActionEvent evt)
   {
     AlignmentAnnotation[] aa = av.getAlignment().getAlignmentAnnotation();
@@ -175,8 +195,9 @@ public class AnnotationLabels extends Panel implements ActionListener,
               ap.alignFrame);
       Frame frame = new Frame();
       frame.add(cap);
-      jalview.bin.JalviewLite.addFrame(frame, ap.alignFrame.getTitle()
-              + " - " + aa[selectedRow].label, 500, 100);
+      jalview.bin.JalviewLite.addFrame(frame,
+              ap.alignFrame.getTitle() + " - " + aa[selectedRow].label, 500,
+              100);
       cap.setText(aa[selectedRow].toString());
     }
     else if (evt.getActionCommand().equals(COPYCONS_SEQ))
@@ -188,16 +209,26 @@ public class AnnotationLabels extends Panel implements ActionListener,
       }
 
     }
+    refresh();
+  }
+
+  /**
+   * Adjust size and repaint
+   */
+  protected void refresh()
+  {
     ap.annotationPanel.adjustPanelHeight();
     setSize(getSize().width, ap.annotationPanel.getSize().height);
     ap.validate();
-    ap.paintAlignment(true);
+    // TODO: only paint if we needed to
+    ap.paintAlignment(true, true);
   }
 
   boolean editLabelDescription(AlignmentAnnotation annotation)
   {
-    Checkbox padGaps = new Checkbox("Fill Empty Gaps With \""
-            + ap.av.getGapCharacter() + "\"", annotation.padGaps);
+    Checkbox padGaps = new Checkbox(
+            "Fill Empty Gaps With \"" + ap.av.getGapCharacter() + "\"",
+            annotation.padGaps);
 
     EditNameDialog dialog = new EditNameDialog(annotation.label,
             annotation.description, "      Annotation Label",
@@ -220,15 +251,21 @@ public class AnnotationLabels extends Panel implements ActionListener,
       return true;
     }
     else
+    {
       return false;
+    }
 
   }
 
   boolean resizePanel = false;
 
+  @Override
   public void mouseMoved(MouseEvent evt)
   {
-    resizePanel = evt.getY() < 10 && evt.getX() < 14;
+    resizePanel = evt.getY() < HEIGHT_ADJUSTER_HEIGHT
+            && evt.getX() < HEIGHT_ADJUSTER_WIDTH;
+    setCursor(Cursor.getPredefinedCursor(
+            resizePanel ? Cursor.S_RESIZE_CURSOR : Cursor.DEFAULT_CURSOR));
     int row = getSelectedRow(evt.getY() + scrollOffset);
 
     if (row > -1)
@@ -271,6 +308,7 @@ public class AnnotationLabels extends Panel implements ActionListener,
     dragCancelled = true;
   }
 
+  @Override
   public void mouseDragged(MouseEvent evt)
   {
     if (dragCancelled)
@@ -282,26 +320,28 @@ public class AnnotationLabels extends Panel implements ActionListener,
 
     if (resizePanel)
     {
-      Dimension d = ap.annotationPanelHolder.getSize(), e = ap.annotationSpaceFillerHolder
-              .getSize(), f = ap.seqPanelHolder.getSize();
+      Dimension d = ap.annotationPanelHolder.getSize(),
+              e = ap.annotationSpaceFillerHolder.getSize(),
+              f = ap.seqPanelHolder.getSize();
       int dif = evt.getY() - oldY;
 
-      dif /= ap.av.charHeight;
-      dif *= ap.av.charHeight;
+      dif /= ap.av.getCharHeight();
+      dif *= ap.av.getCharHeight();
 
       if ((d.height - dif) > 20 && (f.height + dif) > 20)
       {
         ap.annotationPanel.setSize(d.width, d.height - dif);
         setSize(new Dimension(e.width, d.height - dif));
-        ap.annotationSpaceFillerHolder.setSize(new Dimension(e.width,
-                d.height - dif));
-        ap.annotationPanelHolder.setSize(new Dimension(d.width, d.height
-                - dif));
+        ap.annotationSpaceFillerHolder
+                .setSize(new Dimension(e.width, d.height - dif));
+        ap.annotationPanelHolder
+                .setSize(new Dimension(d.width, d.height - dif));
         ap.apvscroll.setValues(ap.apvscroll.getValue(), d.height - dif, 0,
                 av.calcPanelHeight());
         f.height += dif;
         ap.seqPanelHolder.setPreferredSize(f);
-        ap.setScrollValues(av.getStartRes(), av.getStartSeq());
+        ap.setScrollValues(av.getRanges().getStartRes(),
+                av.getRanges().getStartSeq());
         ap.validate();
         // ap.paintAlignment(true);
         ap.addNotify();
@@ -330,10 +370,12 @@ public class AnnotationLabels extends Panel implements ActionListener,
     }
   }
 
+  @Override
   public void mouseClicked(MouseEvent evt)
   {
   }
 
+  @Override
   public void mouseReleased(MouseEvent evt)
   {
     if (!resizePanel && !dragCancelled)
@@ -361,10 +403,12 @@ public class AnnotationLabels extends Panel implements ActionListener,
     resizePanel = false;
     dragEvent = null;
     dragCancelled = false;
+    setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
     repaint();
     ap.annotationPanel.repaint();
   }
 
+  @Override
   public void mouseEntered(MouseEvent evt)
   {
     if (evt.getY() < 10 && evt.getX() < 14)
@@ -372,8 +416,11 @@ public class AnnotationLabels extends Panel implements ActionListener,
       resizePanel = true;
       repaint();
     }
+    setCursor(Cursor.getPredefinedCursor(
+            resizePanel ? Cursor.S_RESIZE_CURSOR : Cursor.DEFAULT_CURSOR));
   }
 
+  @Override
   public void mouseExited(MouseEvent evt)
   {
     dragCancelled = false;
@@ -392,6 +439,7 @@ public class AnnotationLabels extends Panel implements ActionListener,
     repaint();
   }
 
+  @Override
   public void mousePressed(MouseEvent evt)
   {
     oldY = evt.getY();
@@ -407,10 +455,12 @@ public class AnnotationLabels extends Panel implements ActionListener,
             .getAlignmentAnnotation();
 
     // DETECT RIGHT MOUSE BUTTON IN AWT
-    if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
+    if ((evt.getModifiers()
+            & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK)
     {
 
-      PopupMenu popup = new PopupMenu(MessageManager.getString("label.annotations"));
+      PopupMenu popup = new PopupMenu(
+              MessageManager.getString("label.annotations"));
 
       MenuItem item = new MenuItem(ADDNEW);
       item.addActionListener(this);
@@ -435,6 +485,32 @@ public class AnnotationLabels extends Panel implements ActionListener,
       item = new MenuItem(HIDE);
       item.addActionListener(this);
       popup.add(item);
+
+      /*
+       * Hide all <label>:
+       */
+      if (selectedRow < aa.length)
+      {
+        if (aa[selectedRow].sequenceRef != null)
+        {
+          final String label = aa[selectedRow].label;
+          MenuItem hideType = new MenuItem(
+                  MessageManager.getString("label.hide_all") + " " + label);
+          hideType.addActionListener(new ActionListener()
+          {
+            @Override
+            public void actionPerformed(ActionEvent e)
+            {
+              AlignmentUtils.showOrHideSequenceAnnotations(
+                      ap.av.getAlignment(), Collections.singleton(label),
+                      null, false, false);
+              refresh();
+            }
+          });
+          popup.add(hideType);
+        }
+      }
+
       if (hasHiddenRows)
       {
         item = new MenuItem(SHOWALL);
@@ -453,13 +529,15 @@ public class AnnotationLabels extends Panel implements ActionListener,
           {
             popup.addSeparator();
             final CheckboxMenuItem cbmi = new CheckboxMenuItem(
-                    "Ignore Gaps In Consensus",
-                    (aa[selectedRow].groupRef != null) ? aa[selectedRow].groupRef
-                            .getIgnoreGapsConsensus() : ap.av
-                            .getIgnoreGapsConsensus());
+                    MessageManager.getString("label.ignore_gaps_consensus"),
+                    (aa[selectedRow].groupRef != null)
+                            ? aa[selectedRow].groupRef
+                                    .getIgnoreGapsConsensus()
+                            : ap.av.isIgnoreGapsConsensus());
             final AlignmentAnnotation aaa = aa[selectedRow];
             cbmi.addItemListener(new ItemListener()
             {
+              @Override
               public void itemStateChanged(ItemEvent e)
               {
                 if (aaa.groupRef != null)
@@ -469,19 +547,21 @@ public class AnnotationLabels extends Panel implements ActionListener,
                 }
                 else
                 {
-                  ap.av.setIgnoreGapsConsensus(cbmi.getState());
+                  ap.av.setIgnoreGapsConsensus(cbmi.getState(), ap);
                 }
-                ap.paintAlignment(true);
+                ap.paintAlignment(true, true);
               }
             });
             popup.add(cbmi);
             if (aaa.groupRef != null)
             {
               final CheckboxMenuItem chist = new CheckboxMenuItem(
-                      "Show Group Histogram",
+                      MessageManager
+                              .getString("label.show_group_histogram"),
                       aa[selectedRow].groupRef.isShowConsensusHistogram());
               chist.addItemListener(new ItemListener()
               {
+                @Override
                 public void itemStateChanged(ItemEvent e)
                 {
                   // TODO: pass on reference
@@ -497,10 +577,11 @@ public class AnnotationLabels extends Panel implements ActionListener,
               });
               popup.add(chist);
               final CheckboxMenuItem cprofl = new CheckboxMenuItem(
-                      "Show Group Logo",
+                      MessageManager.getString("label.show_group_logo"),
                       aa[selectedRow].groupRef.isShowSequenceLogo());
               cprofl.addItemListener(new ItemListener()
               {
+                @Override
                 public void itemStateChanged(ItemEvent e)
                 {
                   // TODO: pass on reference
@@ -517,10 +598,12 @@ public class AnnotationLabels extends Panel implements ActionListener,
 
               popup.add(cprofl);
               final CheckboxMenuItem cprofn = new CheckboxMenuItem(
-                      "Normalise Group Logo",
+                      MessageManager
+                              .getString("label.normalise_group_logo"),
                       aa[selectedRow].groupRef.isNormaliseSequenceLogo());
               cprofn.addItemListener(new ItemListener()
               {
+                @Override
                 public void itemStateChanged(ItemEvent e)
                 {
                   // TODO: pass on reference
@@ -540,9 +623,11 @@ public class AnnotationLabels extends Panel implements ActionListener,
             else
             {
               final CheckboxMenuItem chist = new CheckboxMenuItem(
-                      "Show Histogram", av.isShowConsensusHistogram());
+                      MessageManager.getString("label.show_histogram"),
+                      av.isShowConsensusHistogram());
               chist.addItemListener(new ItemListener()
               {
+                @Override
                 public void itemStateChanged(ItemEvent e)
                 {
                   // TODO: pass on reference
@@ -552,19 +637,21 @@ public class AnnotationLabels extends Panel implements ActionListener,
                   // can be
                   // updated.
                   av.setShowConsensusHistogram(chist.getState());
-                  ap.alignFrame.showConsensusHistogram.setState(chist
-                          .getState()); // TODO: implement
-                                        // ap.updateGUI()/alignFrame.updateGUI
-                                        // for applet
+                  ap.alignFrame.showConsensusHistogram
+                          .setState(chist.getState()); // TODO: implement
+                                                       // ap.updateGUI()/alignFrame.updateGUI
+                                                       // for applet
                   ap.repaint();
                   // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
                 }
               });
               popup.add(chist);
               final CheckboxMenuItem cprof = new CheckboxMenuItem(
-                      "Show Logo", av.isShowSequenceLogo());
+                      MessageManager.getString("label.show_logo"),
+                      av.isShowSequenceLogo());
               cprof.addItemListener(new ItemListener()
               {
+                @Override
                 public void itemStateChanged(ItemEvent e)
                 {
                   // TODO: pass on reference
@@ -585,9 +672,11 @@ public class AnnotationLabels extends Panel implements ActionListener,
               });
               popup.add(cprof);
               final CheckboxMenuItem cprofn = new CheckboxMenuItem(
-                      "Normalise Logo", av.isNormaliseSequenceLogo());
+                      MessageManager.getString("label.normalise_logo"),
+                      av.isNormaliseSequenceLogo());
               cprofn.addItemListener(new ItemListener()
               {
+                @Override
                 public void itemStateChanged(ItemEvent e)
                 {
                   // TODO: pass on reference
@@ -597,11 +686,12 @@ public class AnnotationLabels extends Panel implements ActionListener,
                   // can be
                   // updated.
                   av.setShowSequenceLogo(true);
-                  ap.alignFrame.normSequenceLogo.setState(cprofn.getState()); // TODO:
-                                                                              // implement
-                                                                              // ap.updateGUI()/alignFrame.updateGUI
-                                                                              // for
-                                                                              // applet
+                  ap.alignFrame.normSequenceLogo
+                          .setState(cprofn.getState()); // TODO:
+                                                        // implement
+                                                        // ap.updateGUI()/alignFrame.updateGUI
+                                                        // for
+                                                        // applet
                   av.setNormaliseSequenceLogo(cprofn.getState());
                   ap.repaint();
                   // ap.annotationPanel.paint(ap.annotationPanel.getGraphics());
@@ -630,35 +720,101 @@ public class AnnotationLabels extends Panel implements ActionListener,
             // todo: make the ap scroll to the selection - not necessary, first
             // click highlights/scrolls, second selects
             ap.seqPanel.ap.idPanel.highlightSearchResults(null);
-            ap.av.setSelectionGroup(// new SequenceGroup(
-            aa[selectedRow].groupRef); // );
-            ap.av.sendSelection();
-            ap.paintAlignment(false);
+            // process modifiers
+            SequenceGroup sg = ap.av.getSelectionGroup();
+            if (sg == null || sg == aa[selectedRow].groupRef
+                    || !(jalview.util.Platform.isControlDown(evt)
+                            || evt.isShiftDown()))
+            {
+              if (jalview.util.Platform.isControlDown(evt)
+                      || evt.isShiftDown())
+              {
+                // clone a new selection group from the associated group
+                ap.av.setSelectionGroup(
+                        new SequenceGroup(aa[selectedRow].groupRef));
+              }
+              else
+              {
+                // set selection to the associated group so it can be edited
+                ap.av.setSelectionGroup(aa[selectedRow].groupRef);
+              }
+            }
+            else
+            {
+              // modify current selection with associated group
+              int remainToAdd = aa[selectedRow].groupRef.getSize();
+              for (SequenceI sgs : aa[selectedRow].groupRef.getSequences())
+              {
+                if (jalview.util.Platform.isControlDown(evt))
+                {
+                  sg.addOrRemove(sgs, --remainToAdd == 0);
+                }
+                else
+                {
+                  // notionally, we should also add intermediate sequences from
+                  // last added sequence ?
+                  sg.addSequence(sgs, --remainToAdd == 0);
+                }
+              }
+            }
+            ap.paintAlignment(false, false);
             PaintRefresher.Refresh(ap, ap.av.getSequenceSetId());
+            ap.av.sendSelection();
           }
           else
           {
-            ap.seqPanel.ap.idPanel
-                    .highlightSearchResults(aa[selectedRow].groupRef
-                            .getSequences(null));
+            ap.seqPanel.ap.idPanel.highlightSearchResults(
+                    aa[selectedRow].groupRef.getSequences(null));
           }
           return;
         }
         else if (aa[selectedRow].sequenceRef != null)
         {
-          Vector sr = new Vector();
-          sr.addElement(aa[selectedRow].sequenceRef);
           if (evt.getClickCount() == 1)
           {
-            ap.seqPanel.ap.idPanel.highlightSearchResults(sr);
+            ap.seqPanel.ap.idPanel
+                    .highlightSearchResults(Arrays.asList(new SequenceI[]
+                    { aa[selectedRow].sequenceRef }));
           }
           else if (evt.getClickCount() >= 2)
           {
             ap.seqPanel.ap.idPanel.highlightSearchResults(null);
-            SequenceGroup sg = new SequenceGroup();
-            sg.addSequence(aa[selectedRow].sequenceRef, false);
+            SequenceGroup sg = ap.av.getSelectionGroup();
+            if (sg != null)
+            {
+              // we make a copy rather than edit the current selection if no
+              // modifiers pressed
+              // see Enhancement JAL-1557
+              if (!(jalview.util.Platform.isControlDown(evt)
+                      || evt.isShiftDown()))
+              {
+                sg = new SequenceGroup(sg);
+                sg.clear();
+                sg.addSequence(aa[selectedRow].sequenceRef, false);
+              }
+              else
+              {
+                if (jalview.util.Platform.isControlDown(evt))
+                {
+                  sg.addOrRemove(aa[selectedRow].sequenceRef, true);
+                }
+                else
+                {
+                  // notionally, we should also add intermediate sequences from
+                  // last added sequence ?
+                  sg.addSequence(aa[selectedRow].sequenceRef, true);
+                }
+              }
+            }
+            else
+            {
+              sg = new SequenceGroup();
+              sg.setStartRes(0);
+              sg.setEndRes(ap.av.getAlignment().getWidth() - 1);
+              sg.addSequence(aa[selectedRow].sequenceRef, false);
+            }
             ap.av.setSelectionGroup(sg);
-            ap.paintAlignment(false);
+            ap.paintAlignment(false, false);
             PaintRefresher.Refresh(ap, ap.av.getSequenceSetId());
             ap.av.sendSelection();
           }
@@ -682,29 +838,23 @@ public class AnnotationLabels extends Panel implements ActionListener,
       return;
     }
     jalview.appletgui.AlignFrame.copiedSequences = new StringBuffer();
-    jalview.appletgui.AlignFrame.copiedSequences.append(sq.getName() + "\t"
-            + sq.getStart() + "\t" + sq.getEnd() + "\t"
-            + sq.getSequenceAsString() + "\n");
+    jalview.appletgui.AlignFrame.copiedSequences
+            .append(sq.getName() + "\t" + sq.getStart() + "\t" + sq.getEnd()
+                    + "\t" + sq.getSequenceAsString() + "\n");
     if (av.hasHiddenColumns())
     {
-      jalview.appletgui.AlignFrame.copiedHiddenColumns = new Vector();
-      for (int i = 0; i < av.getColumnSelection().getHiddenColumns().size(); i++)
-      {
-        int[] region = (int[]) av.getColumnSelection().getHiddenColumns()
-                .elementAt(i);
-
-        jalview.appletgui.AlignFrame.copiedHiddenColumns
-                .addElement(new int[]
-                { region[0], region[1] });
-      }
+      jalview.appletgui.AlignFrame.copiedHiddenColumns = new HiddenColumns(
+              av.getAlignment().getHiddenColumns());
     }
   }
 
+  @Override
   public void update(Graphics g)
   {
     paint(g);
   }
 
+  @Override
   public void paint(Graphics g)
   {
     int w = getSize().width;
@@ -753,25 +903,20 @@ public class AnnotationLabels extends Panel implements ActionListener,
       }
     }
     g.translate(0, +scrollOffset);
-    if (resizePanel)
-    {
-      g.setColor(Color.red);
-      g.setPaintMode();
-      g.drawLine(2, 8, 5, 2);
-      g.drawLine(5, 2, 8, 8);
-    }
-    else if (!dragCancelled && dragEvent != null && aa != null)
+
+    if (!resizePanel && !dragCancelled && dragEvent != null && aa != null)
     {
       g.setColor(Color.lightGray);
       g.drawString(aa[selectedRow].label, dragEvent.getX(),
               dragEvent.getY());
     }
 
-    if (!av.wrapAlignment && ((aa == null) || (aa.length < 1)))
+    if (!av.getWrapAlignment() && ((aa == null) || (aa.length < 1)))
     {
       g.setColor(Color.black);
       g.drawString(MessageManager.getString("label.right_click"), 2, 8);
-      g.drawString(MessageManager.getString("label.to_add_annotation"), 2, 18);
+      g.drawString(MessageManager.getString("label.to_add_annotation"), 2,
+              18);
     }
   }
 }