JAL-2077 - reinstate popups on osx
[jalview.git] / src / jalview / gui / Desktop.java
index 3f92334..8e863c1 100644 (file)
@@ -23,6 +23,7 @@ package jalview.gui;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.bin.Cache;
+import jalview.bin.Jalview;
 import jalview.io.FileLoader;
 import jalview.io.FormatAdapter;
 import jalview.io.IdentifyFile;
@@ -188,6 +189,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       this.delegate = delegate;
     }
 
+    @Override
     public void activateFrame(JInternalFrame f)
     {
       try
@@ -200,31 +202,37 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       }
     }
 
+    @Override
     public void beginDraggingFrame(JComponent f)
     {
       delegate.beginDraggingFrame(f);
     }
 
+    @Override
     public void beginResizingFrame(JComponent f, int direction)
     {
       delegate.beginResizingFrame(f, direction);
     }
 
+    @Override
     public void closeFrame(JInternalFrame f)
     {
       delegate.closeFrame(f);
     }
 
+    @Override
     public void deactivateFrame(JInternalFrame f)
     {
       delegate.deactivateFrame(f);
     }
 
+    @Override
     public void deiconifyFrame(JInternalFrame f)
     {
       delegate.deiconifyFrame(f);
     }
 
+    @Override
     public void dragFrame(JComponent f, int newX, int newY)
     {
       if (newY < 0)
@@ -234,31 +242,37 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       delegate.dragFrame(f, newX, newY);
     }
 
+    @Override
     public void endDraggingFrame(JComponent f)
     {
       delegate.endDraggingFrame(f);
     }
 
+    @Override
     public void endResizingFrame(JComponent f)
     {
       delegate.endResizingFrame(f);
     }
 
+    @Override
     public void iconifyFrame(JInternalFrame f)
     {
       delegate.iconifyFrame(f);
     }
 
+    @Override
     public void maximizeFrame(JInternalFrame f)
     {
       delegate.maximizeFrame(f);
     }
 
+    @Override
     public void minimizeFrame(JInternalFrame f)
     {
       delegate.minimizeFrame(f);
     }
 
+    @Override
     public void openFrame(JInternalFrame f)
     {
       delegate.openFrame(f);
@@ -275,6 +289,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       delegate.resizeFrame(f, newX, newY, newWidth, newHeight);
     }
 
+    @Override
     public void setBoundsForFrame(JComponent f, int newX, int newY,
             int newWidth, int newHeight)
     {
@@ -355,6 +370,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
 
     this.addWindowListener(new WindowAdapter()
     {
+      @Override
       public void windowClosing(WindowEvent evt)
       {
         quit();
@@ -364,9 +380,10 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     MouseAdapter ma;
     this.addMouseListener(ma = new MouseAdapter()
     {
+      @Override
       public void mousePressed(MouseEvent evt)
       {
-        if (SwingUtilities.isRightMouseButton(evt))
+        if (evt.isPopupTrigger())
         {
           showPasteMenu(evt.getX(), evt.getY());
         }
@@ -396,6 +413,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     // Spawn a thread that shows the splashscreen
     SwingUtilities.invokeLater(new Runnable()
     {
+      @Override
       public void run()
       {
         new SplashScreen();
@@ -407,6 +425,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     // takes to open it later on.
     new Thread(new Runnable()
     {
+      @Override
       public void run()
       {
         Cache.log.debug("Filechooser init thread started.");
@@ -578,16 +597,19 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         // reselected again.
         boolean refresh = true;
 
+        @Override
         public void menuCanceled(MenuEvent e)
         {
           refresh = true;
         }
 
+        @Override
         public void menuDeselected(MenuEvent e)
         {
           refresh = true;
         }
 
+        @Override
         public void menuSelected(MenuEvent e)
         {
           if (refresh)
@@ -608,6 +630,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
             MessageManager.getString("label.paste_new_window"));
     item.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent evt)
       {
         paste();
@@ -630,7 +653,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
         String file = (String) contents
                 .getTransferData(DataFlavor.stringFlavor);
 
-        String format = new IdentifyFile().Identify(file,
+        String format = new IdentifyFile().identify(file,
                 FormatAdapter.PASTE);
 
         new FileLoader().LoadFile(file, FormatAdapter.PASTE, format);
@@ -771,6 +794,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     final JMenuItem menuItem = new JMenuItem(title);
     frame.addInternalFrameListener(new javax.swing.event.InternalFrameAdapter()
     {
+      @Override
       public void internalFrameActivated(
               javax.swing.event.InternalFrameEvent evt)
       {
@@ -782,6 +806,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
 
       }
 
+      @Override
       public void internalFrameClosed(
               javax.swing.event.InternalFrameEvent evt)
       {
@@ -799,6 +824,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
 
     menuItem.addActionListener(new ActionListener()
     {
+      @Override
       public void actionPerformed(ActionEvent e)
       {
         try
@@ -871,6 +897,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     }
   }
 
+  @Override
   public void lostOwnership(Clipboard clipboard, Transferable contents)
   {
     if (!internalCopy)
@@ -881,14 +908,17 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     internalCopy = false;
   }
 
+  @Override
   public void dragEnter(DropTargetDragEvent evt)
   {
   }
 
+  @Override
   public void dragExit(DropTargetEvent evt)
   {
   }
 
+  @Override
   public void dragOver(DropTargetDragEvent evt)
   {
   }
@@ -904,6 +934,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
    * @param evt
    *          DOCUMENT ME!
    */
+  @Override
   public void drop(DropTargetDropEvent evt)
   {
     boolean success = true;
@@ -976,7 +1007,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
           }
           else
           {
-            format = new IdentifyFile().Identify(file, protocol);
+            format = new IdentifyFile().identify(file, protocol);
           }
 
           new FileLoader().LoadFile(file, protocol, format);
@@ -1027,20 +1058,13 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       }
       else
       {
-        format = new IdentifyFile().Identify(choice, FormatAdapter.FILE);
+        format = new IdentifyFile().identify(choice, FormatAdapter.FILE);
       }
 
       if (viewport != null)
       {
         new FileLoader().LoadFile(viewport, choice, FormatAdapter.FILE,
                 format);
-        // viewport.setShowSequenceFeatures(JSONFile.isSeqFeaturesEnabled());
-        // AlignFrame af = viewport.getAlignPanel().alignFrame;
-        // if (af != null)
-        // {
-        // af.changeColour(JSONFile.getColourScheme());
-        // af.setMenusForViewport();
-        // }
       }
       else
       {
@@ -1110,7 +1134,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     }
     else
     {
-      String format = new IdentifyFile().Identify(url, FormatAdapter.URL);
+      String format = new IdentifyFile().identify(url, FormatAdapter.URL);
 
       if (format.equals("URL NOT FOUND"))
       {
@@ -1211,6 +1235,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     // message.toString(), "About Jalview", JOptionPane.INFORMATION_MESSAGE);
     new Thread(new Runnable()
     {
+      @Override
       public void run()
       {
         new SplashScreen(true);
@@ -1521,6 +1546,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
 
       new Thread(new Runnable()
       {
+        @Override
         public void run()
         {
           // TODO: refactor to Jalview desktop session controller action.
@@ -1592,6 +1618,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
               selectedFile.getParent());
       new Thread(new Runnable()
       {
+        @Override
         public void run()
         {
           setProgressBar(
@@ -2111,6 +2138,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
           sessit.addActionListener(new ActionListener()
           {
 
+            @Override
             public void actionPerformed(ActionEvent e)
             {
               if (dsktp.v_client == null)
@@ -2118,6 +2146,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
                 Thread rthr = new Thread(new Runnable()
                 {
 
+                  @Override
                   public void run()
                   {
                     dsktp.v_client = new VamsasApplication(dsktp, mysesid);
@@ -2290,6 +2319,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       return showMemoryUsage;
     }
 
+    @Override
     public void run()
     {
       df = java.text.NumberFormat.getNumberInstance();
@@ -2364,6 +2394,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       groovyShell.setText(MessageManager.getString("label.groovy_console"));
       groovyShell.addActionListener(new ActionListener()
       {
+        @Override
         public void actionPerformed(ActionEvent e)
         {
           groovyShell_actionPerformed();
@@ -2381,6 +2412,12 @@ public class Desktop extends jalview.jbgui.GDesktop implements
    */
   public static AlignFrame[] getAlignFrames()
   {
+    if (Jalview.isHeadlessMode())
+    {
+      // Desktop.desktop is null in headless mode
+      return new AlignFrame[] { currentAlignFrame };
+    }
+
     JInternalFrame[] frames = Desktop.desktop.getAllFrames();
 
     if (frames == null)
@@ -2470,9 +2507,21 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       java.lang.reflect.Method setvar = gcClass.getMethod("setVariable",
               new Class[] { String.class, Object.class });
       java.lang.reflect.Method run = gcClass.getMethod("run");
-      Object gc = gccons.newInstance();
-      setvar.invoke(gc, new Object[] { "Jalview", this });
-      run.invoke(gc);
+      groovyConsole = gccons.newInstance();
+      setvar.invoke(groovyConsole, new Object[] { "Jalview", this });
+      run.invoke(groovyConsole);
+      /*
+       * and rebuild alignframe menus to enable 'Run Groovy'
+       */
+
+      AlignFrame[] alignFrames = getAlignFrames();
+      if (alignFrames != null)
+      {
+        for (AlignFrame af : alignFrames)
+        {
+          af.setGroovyEnabled(true);
+        }
+      }
     } catch (Exception ex)
     {
       jalview.bin.Cache.log.error("Groovy Shell Creation failed.", ex);
@@ -2496,6 +2545,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
    * 
    * @see jalview.gui.IProgressIndicator#setProgressBar(java.lang.String, long)
    */
+  @Override
   public void setProgressBar(String message, long id)
   {
     if (progressBars == null)
@@ -2525,6 +2575,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
    * @see jalview.gui.IProgressIndicator#registerHandler(long,
    * jalview.gui.IProgressIndicatorHandler)
    */
+  @Override
   public void registerHandler(final long id,
           final IProgressIndicatorHandler handler)
   {
@@ -2545,6 +2596,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
       cancel.addActionListener(new ActionListener()
       {
 
+        @Override
         public void actionPerformed(ActionEvent e)
         {
           handler.cancelActivity(id);
@@ -2703,6 +2755,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
             // only run if we aren't already displaying one of these.
             addDialogThread(serviceChangedDialog = new Runnable()
             {
+              @Override
               public void run()
               {
 
@@ -2786,6 +2839,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   {
     new Thread(new Runnable()
     {
+      @Override
       public void run()
       {
         try
@@ -2875,6 +2929,13 @@ public class Desktop extends jalview.jbgui.GDesktop implements
    */
   private java.util.concurrent.Semaphore block = new Semaphore(0);
 
+  /*
+   * groovy.ui.Console object - if Groovy jars are present and the 
+   * user has activated the Groovy console. Use via reflection to
+   * avoid compile-time dependency on Groovy libraries.
+   */
+  private static Object groovyConsole;
+
   /**
    * add another dialog thread to the queue
    * 
@@ -2884,6 +2945,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
   {
     dialogExecutor.submit(new Runnable()
     {
+      @Override
       public void run()
       {
         if (dialogPause)
@@ -2927,7 +2989,7 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     ImageMaker im = new jalview.util.ImageMaker(this, ImageMaker.TYPE.EPS,
             "View of Desktop", getWidth(), getHeight(), of = new File(
                     "Jalview_snapshot" + System.currentTimeMillis()
-                            + ".eps"), "View of desktop");
+                            + ".eps"), "View of desktop", null, 0, false);
     try
     {
       paintAll(im.getGraphics());
@@ -2976,25 +3038,39 @@ public class Desktop extends jalview.jbgui.GDesktop implements
        * AlignmentPanel objects, including their AlignmentViewports, so the
        * cdna/protein relationships between the viewports is carried over to the
        * new split frames.
+       * 
+       * explodedGeometry holds the (x, y) position of the previously exploded
+       * SplitFrame, and the (width, height) of the AlignFrame component
        */
       AlignmentPanel topPanel = (AlignmentPanel) topPanels.get(i);
       AlignFrame newTopFrame = new AlignFrame(topPanel);
       newTopFrame.setSize(oldTopFrame.getSize());
       newTopFrame.setVisible(true);
+      Rectangle geometry = ((AlignViewport) topPanel.getAlignViewport())
+              .getExplodedGeometry();
+      if (geometry != null)
+      {
+        newTopFrame.setSize(geometry.getSize());
+      }
+
       AlignmentPanel bottomPanel = (AlignmentPanel) bottomPanels.get(i);
       AlignFrame newBottomFrame = new AlignFrame(bottomPanel);
       newBottomFrame.setSize(oldBottomFrame.getSize());
       newBottomFrame.setVisible(true);
+      geometry = ((AlignViewport) bottomPanel.getAlignViewport())
+              .getExplodedGeometry();
+      if (geometry != null)
+      {
+        newBottomFrame.setSize(geometry.getSize());
+      }
+
       topPanel.av.setGatherViewsHere(false);
       bottomPanel.av.setGatherViewsHere(false);
       JInternalFrame splitFrame = new SplitFrame(newTopFrame,
               newBottomFrame);
-      // either panel may hold previous exploded frame geometry
-      Rectangle geometry = ((AlignViewport) topPanel.getAlignViewport())
-              .getExplodedGeometry();
       if (geometry != null)
       {
-        splitFrame.setBounds(geometry);
+        splitFrame.setLocation(geometry.getLocation());
       }
       Desktop.addInternalFrame(splitFrame, sf.getTitle(), -1, -1);
     }
@@ -3017,10 +3093,18 @@ public class Desktop extends jalview.jbgui.GDesktop implements
    */
   public void gatherViews(GSplitFrame source)
   {
+    /*
+     * special handling of explodedGeometry for a view within a SplitFrame: - it
+     * holds the (x, y) position of the enclosing SplitFrame, and the (width,
+     * height) of the AlignFrame component
+     */
     AlignFrame myTopFrame = (AlignFrame) source.getTopFrame();
     AlignFrame myBottomFrame = (AlignFrame) source.getBottomFrame();
-    myTopFrame.viewport.setExplodedGeometry(source.getBounds());
-    myBottomFrame.viewport.setExplodedGeometry(source.getBounds());
+    myTopFrame.viewport.setExplodedGeometry(new Rectangle(source.getX(),
+            source.getY(), myTopFrame.getWidth(), myTopFrame.getHeight()));
+    myBottomFrame.viewport.setExplodedGeometry(new Rectangle(source.getX(),
+            source.getY(), myBottomFrame.getWidth(), myBottomFrame
+                    .getHeight()));
     myTopFrame.viewport.setGatherViewsHere(true);
     myBottomFrame.viewport.setGatherViewsHere(true);
     String topViewId = myTopFrame.viewport.getSequenceSetId();
@@ -3045,10 +3129,10 @@ public class Desktop extends jalview.jbgui.GDesktop implements
             gatherThis = true;
             topPanel.av.setGatherViewsHere(false);
             bottomPanel.av.setGatherViewsHere(false);
-            // both panels refer to the same split frame geometry
-            Rectangle position = sf.getBounds();
-            topPanel.av.setExplodedGeometry(position);
-            bottomPanel.av.setExplodedGeometry(position);
+            topPanel.av.setExplodedGeometry(new Rectangle(sf.getLocation(),
+                    topFrame.getSize()));
+            bottomPanel.av.setExplodedGeometry(new Rectangle(sf
+                    .getLocation(), bottomFrame.getSize()));
             myTopFrame.addAlignmentPanel(topPanel, false);
             myBottomFrame.addAlignmentPanel(bottomPanel, false);
           }
@@ -3080,4 +3164,9 @@ public class Desktop extends jalview.jbgui.GDesktop implements
     Desktop.currentAlignFrame = currentAlignFrame;
   }
 
+  public static Object getGroovyConsole()
+  {
+    return groovyConsole;
+  }
+
 }