Browse Source

SDK:
- improve blender tool, iconify main window when blender is opened

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10159 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

nor..67 12 years ago
parent
commit
d173e141a0

+ 67 - 10
jme3-blender/src/com/jme3/gde/blender/BlenderTool.java

@@ -5,8 +5,11 @@
 package com.jme3.gde.blender;
 
 import com.jme3.math.Vector3f;
+import java.awt.Frame;
+import java.awt.Window;
 import java.io.File;
 import java.io.IOException;
+import java.util.logging.Level;
 import java.util.logging.Logger;
 import org.openide.DialogDisplayer;
 import org.openide.NotifyDescriptor;
@@ -14,6 +17,7 @@ import org.openide.filesystems.FileObject;
 import org.openide.modules.InstalledFileLocator;
 import org.openide.util.Exceptions;
 import org.openide.util.Utilities;
+import org.openide.windows.WindowManager;
 
 /**
  *
@@ -23,7 +27,7 @@ public class BlenderTool {
 
     private static final Logger logger = Logger.getLogger(BlenderTool.class.getName());
     private static boolean running = false;
-//    private static AtomicBoolean running = new AtomicBoolean(false);
+    private static Window blenderWindow = null;
 
     private static String getBlenderExeName() {
         if (Utilities.isWindows()) {
@@ -36,7 +40,8 @@ public class BlenderTool {
     public static File getBlenderExecutable() {
         File blender = InstalledFileLocator.getDefault().locate("../blender/" + getBlenderExeName(), null, false);
         if (blender == null) {
-            DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message("Error finding Blender!"));
+            DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message("Error finding Blender executable at\n" + blender.getPath()));
+            logger.log(Level.SEVERE, "Error finding Blender executable at {0}", blender.getPath());
         }
         return blender;
     }
@@ -44,7 +49,8 @@ public class BlenderTool {
     public static File getBlenderSettingsFolder() {
         File blender = InstalledFileLocator.getDefault().locate("../blender/2.64", null, false);
         if (blender == null) {
-            DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message("Error finding Blender!"));
+            DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message("Error finding Blender settings at\n" + blender.getPath()));
+            logger.log(Level.SEVERE, "Error finding Blender settings at {0}", blender.getPath());
         }
         return blender;
     }
@@ -56,28 +62,64 @@ public class BlenderTool {
 //        }
         File blender = InstalledFileLocator.getDefault().locate("../blender", null, false);
         if (blender == null) {
-            DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message("Error finding Blender!"));
+            DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message("Error finding Blender root folder at\n" + blender.getPath()));
+            logger.log(Level.SEVERE, "Error finding Blender root folder at {0}", blender.getPath());
         }
         return blender;
 
     }
-    
-    public static boolean openInBlender(FileObject file){
+
+    public static boolean openInBlender(FileObject file) {
         String path = file.getPath().replace("/", File.separator);
         return runBlender(path, true);
     }
 
+    private static void setBlendWin(Window win) {
+        blenderWindow = win;
+    }
+
+    public static boolean blenderToFront() {
+        Window win = blenderWindow;
+        if (win != null) {
+            logger.log(Level.INFO, "Request focus of Blender window {0}", win);
+            win.requestFocus();
+            return true;
+        }
+        return false;
+    }
+
     public static boolean runBlender(final String options, boolean async) {
+        logger.log(Level.INFO, "Try running blender with options {0}", options);
         if (running) {
+            logger.log(Level.INFO, "Blender seems to be running");
             return false;
         }
+        blenderWindow = null;
         running = true;
         //TODO: wtf, for some reason i cannot access AtomicBoolean..
         final Vector3f v = new Vector3f(0, 0, 0);
         final File exe = getBlenderExecutable();
         if (exe == null) {
+            logger.log(Level.SEVERE, "Could not find blender executable!");
+            running = false;
             return false;
         }
+        final Frame mainWin = WindowManager.getDefault().getMainWindow();
+        assert (mainWin != null);
+        logger.log(Level.INFO, "Adding focus listener to window {0}", mainWin);
+//        mainWin.addWindowFocusListener(new WindowFocusListener() {
+//            public void windowGainedFocus(WindowEvent e) {
+//            }
+//
+//            public void windowLostFocus(WindowEvent e) {
+//                Window blendWin = e.getOppositeWindow();
+//                logger.log(Level.INFO, "Lost focus to window {0}, use as Blender window", blendWin);
+//                setBlendWin(blendWin);
+//                mainWin.removeWindowFocusListener(this);
+//                logger.log(Level.INFO, "Remove focus listener from window {0}", mainWin);
+//            }
+//        });
+        mainWin.setState(Frame.ICONIFIED);
         Runnable r = new Runnable() {
             public void run() {
                 try {
@@ -89,9 +131,7 @@ public class BlenderTool {
                     }
                     Process proc = Runtime.getRuntime().exec(command);
                     OutputReader outReader = new OutputReader(proc.getInputStream());
-//            outReader.setProgress(handle);
                     OutputReader errReader = new OutputReader(proc.getErrorStream());
-//            errReader.setProgress(handle);
                     outReader.start();
                     errReader.start();
                     try {
@@ -102,10 +142,22 @@ public class BlenderTool {
                     if (proc.exitValue() != 0) {
                         v.x = 1;
                     }
+                    java.awt.EventQueue.invokeLater(new Runnable() {
+                        public void run() {
+                            mainWin.setState(Frame.NORMAL);
+                        }
+                    });
+                    blenderWindow = null;
                     running = false;
                 } catch (IOException ex) {
                     Exceptions.printStackTrace(ex);
                     v.x = 1;
+                    java.awt.EventQueue.invokeLater(new Runnable() {
+                        public void run() {
+                            mainWin.setState(Frame.NORMAL);
+                        }
+                    });
+                    blenderWindow = null;
                     running = false;
                 }
             }
@@ -123,8 +175,13 @@ public class BlenderTool {
     }
 
     public static void runBlender() {
-        if(!runBlender(null, true)){
-            DialogDisplayer.getDefault().notifyLater(new NotifyDescriptor.Message("Error running Blender."));
+        if (!runBlender(null, true)) {
+            logger.log(Level.INFO, "Could not run blender, already running? Trying to focus window.");
+            if (!blenderToFront()) {
+                logger.log(Level.INFO, "Could not bring blender to front.");
+            } else {
+                logger.log(Level.INFO, "Requested Blender window focus.");
+            }
         }
     }
 }

+ 2 - 1
jme3-blender/src/com/jme3/gde/blender/OutputReader.java

@@ -17,6 +17,7 @@ import org.netbeans.api.progress.ProgressHandle;
  */
 public class OutputReader implements Runnable {
 
+    private static final Logger logger = Logger.getLogger(OutputReader.class.getName());
     private Thread thread;
     private BufferedReader in;
     private ProgressHandle progress;
@@ -42,7 +43,7 @@ public class OutputReader implements Runnable {
                     if (progress != null) {
                         progress.progress(line);
                     } else {
-                        Logger.getLogger(OutputReader.class.getName()).log(Level.INFO, "{0}",line);
+                        logger.log(Level.INFO, "{0}", line);
                     }
                 }
             }