Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / gui / AppJmol.java
index 930a750..4d0de1b 100644 (file)
@@ -28,16 +28,10 @@ import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.io.File;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.io.File;
-import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
 
 import javax.swing.JPanel;
 import javax.swing.JSplitPane;
 
 import javax.swing.JPanel;
 import javax.swing.JSplitPane;
@@ -270,6 +264,8 @@ public class AppJmol extends StructureViewerBase
     }
     jmb.executeCommand(new StructureCommand(command), false);
     jmb.executeCommand(new StructureCommand("set hoverDelay=0.1"), false);
     }
     jmb.executeCommand(new StructureCommand(command), false);
     jmb.executeCommand(new StructureCommand("set hoverDelay=0.1"), false);
+    jmb.executeCommand(new StructureCommand("set antialiasdisplay on"),
+            false);
     jmb.setFinishedInit(true);
   }
 
     jmb.setFinishedInit(true);
   }
 
@@ -371,9 +367,10 @@ public class AppJmol extends StructureViewerBase
       }
       if (waitTotal > waitMax)
       {
       }
       if (waitTotal > waitMax)
       {
-        System.err.println("Timed out waiting for Jmol to load files after "
-                + waitTotal + "ms");
-        // System.err.println("finished: " + jmb.isFinishedInit()
+        jalview.bin.Console.errPrintln(
+                "Timed out waiting for Jmol to load files after "
+                        + waitTotal + "ms");
+        // jalview.bin.Console.errPrintln("finished: " + jmb.isFinishedInit()
         // + "; loaded: " + Arrays.toString(jmb.getPdbFile())
         // + "; files: " + files.toString());
         jmb.getStructureFiles();
         // + "; loaded: " + Arrays.toString(jmb.getPdbFile())
         // + "; files: " + files.toString());
         jmb.getStructureFiles();
@@ -424,6 +421,14 @@ public class AppJmol extends StructureViewerBase
 
   }
 
 
   }
 
+  public boolean isRepainting()
+  {
+    if (renderPanel!=null && renderPanel.isVisible())
+    {
+      return renderPanel.repainting;
+    }
+    return false;
+  }
   /**
    * Outputs the Jmol viewer image as an image file, after prompting the user to
    * choose a file and (for EPS) choice of Text or Lineart character rendering
   /**
    * Outputs the Jmol viewer image as an image file, after prompting the user to
    * choose a file and (for EPS) choice of Text or Lineart character rendering
@@ -434,11 +439,21 @@ public class AppJmol extends StructureViewerBase
   @Override
   public void makePDBImage(ImageMaker.TYPE type)
   {
   @Override
   public void makePDBImage(ImageMaker.TYPE type)
   {
-    try {
-    makePDBImage(null, type, null,
-            BitmapImageSizing.nullBitmapImageSizing());
-    } catch (ImageOutputException ioex) {
-      Console.error("Unexpected error whilst writing "+type.toString(),ioex);
+    while (!isRepainting())
+    {
+      try {
+        Thread.sleep(2);
+      } catch (Exception q)
+      {}
+    }
+    try
+    {
+      makePDBImage(null, type, null,
+              BitmapImageSizing.defaultBitmapImageSizing());
+    } catch (ImageOutputException ioex)
+    {
+      Console.error("Unexpected error whilst writing " + type.toString(),
+              ioex);
     }
   }
 
     }
   }
 
@@ -450,9 +465,9 @@ public class AppJmol extends StructureViewerBase
 
     BitmapImageSizing bis = ImageMaker.getScaleWidthHeight(width, height,
             userBis);
 
     BitmapImageSizing bis = ImageMaker.getScaleWidthHeight(width, height,
             userBis);
-    float usescale = bis.scale;
-    int usewidth = bis.width;
-    int useheight = bis.height;
+    float usescale = bis.scale();
+    int usewidth = bis.width();
+    int useheight = bis.height();
 
     ImageWriterI writer = new ImageWriterI()
     {
 
     ImageWriterI writer = new ImageWriterI()
     {
@@ -472,7 +487,6 @@ public class AppJmol extends StructureViewerBase
           }
         }
 
           }
         }
 
-        jmb.jmolViewer.antialiased = true;
         jmb.jmolViewer.requestRepaintAndWait("image export");
         jmb.jmolViewer.renderScreenImage(ig2, usewidth, useheight);
       }
         jmb.jmolViewer.requestRepaintAndWait("image export");
         jmb.jmolViewer.renderScreenImage(ig2, usewidth, useheight);
       }
@@ -481,28 +495,40 @@ public class AppJmol extends StructureViewerBase
             .toLowerCase(Locale.ROOT);
     final ImageExporter exporter = new ImageExporter(writer,
             getProgressIndicator(), type, getTitle());
             .toLowerCase(Locale.ROOT);
     final ImageExporter exporter = new ImageExporter(writer,
             getProgressIndicator(), type, getTitle());
-    
+
     final Throwable[] exceptions = new Throwable[1];
     exceptions[0] = null;
     final AppJmol us = this;
     try
     {
     final Throwable[] exceptions = new Throwable[1];
     exceptions[0] = null;
     final AppJmol us = this;
     try
     {
-      Thread runner = Executors.defaultThreadFactory().newThread(new Runnable()
+      Thread runner = Executors.defaultThreadFactory()
+              .newThread(new Runnable()
+              {
+                @Override
+                public void run()
+                {
+                  try
+                  {
+                    exporter.doExport(file, us, width, height, view,
+                            renderer, userBis);
+                  } catch (Throwable t)
+                  {
+                    exceptions[0] = t;
+                  }
+                }
+              });
+      runner.start();
+      long time = 0;
+      do
       {
       {
-        @Override
-        public void run()
-        {
-          try
-          {
-            exporter.doExport(file, us, width, height, view, renderer,
-                    userBis);
-          } catch (Throwable t)
-          {
-            exceptions[0] = t;
-          }
-        }
-      });
-      do { Thread.sleep(25); } while (runner.isAlive());
+        Thread.sleep(25);
+      } while (runner.isAlive() && time++ < 4000);
+      if (time >= 4000)
+      {
+        runner.interrupt();
+        throw new ImageOutputException(
+                "Jmol took too long to export. Waited for 100 seconds.");
+      }
     } catch (Throwable e)
     {
       throw new ImageOutputException(
     } catch (Throwable e)
     {
       throw new ImageOutputException(
@@ -531,7 +557,8 @@ public class AppJmol extends StructureViewerBase
               .openURL("http://wiki.jmol.org");// http://jmol.sourceforge.net/docs/JmolUserGuide/");
     } catch (Exception ex)
     {
               .openURL("http://wiki.jmol.org");// http://jmol.sourceforge.net/docs/JmolUserGuide/");
     } catch (Exception ex)
     {
-      System.err.println("Show Jmol help failed with: " + ex.getMessage());
+      jalview.bin.Console
+              .errPrintln("Show Jmol help failed with: " + ex.getMessage());
     }
   }
 
     }
   }
 
@@ -615,10 +642,17 @@ public class AppJmol extends StructureViewerBase
       }
       else
       {
       }
       else
       {
-        jmb.jmolViewer.renderScreenImage(g, currentSize.width,
-                currentSize.height);
+        repainting=true;
+        synchronized (jmb)
+        {
+          jmb.jmolViewer.renderScreenImage(g, currentSize.width,
+                  currentSize.height);
+          
+        }
+        repainting=false;
       }
     }
       }
     }
+    volatile boolean repainting=false;
   }
 
   @Override
   }
 
   @Override