Browse Source

Committed a patch from iwgeric, to make nifty Textfield display the soft keyboard on tap.

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9227 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
rem..om 13 years ago
parent
commit
92b97d38d8

+ 79 - 3
engine/src/android/com/jme3/system/android/OGLESContext.java

@@ -32,22 +32,32 @@
 package com.jme3.system.android;
 
 import android.app.Activity;
+import android.app.AlertDialog;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.opengl.GLSurfaceView;
+import android.text.InputType;
+import android.view.Gravity;
 import android.view.SurfaceHolder;
+import android.view.ViewGroup.LayoutParams;
+import android.widget.EditText;
+import android.widget.FrameLayout;
 import com.jme3.app.AndroidHarness;
 import com.jme3.app.Application;
 import com.jme3.input.JoyInput;
 import com.jme3.input.KeyInput;
 import com.jme3.input.MouseInput;
+import com.jme3.input.SoftTextDialogInput;
 import com.jme3.input.TouchInput;
 import com.jme3.input.android.AndroidInput;
+import com.jme3.input.controls.SoftTextDialogInputListener;
 import com.jme3.input.controls.TouchTrigger;
 import com.jme3.input.dummy.DummyKeyInput;
 import com.jme3.input.dummy.DummyMouseInput;
 import com.jme3.renderer.android.OGLESShaderRenderer;
 import com.jme3.system.AppSettings;
 import com.jme3.system.JmeContext;
+import com.jme3.system.JmeSystem;
 import com.jme3.system.SystemListener;
 import com.jme3.system.Timer;
 import com.jme3.system.android.AndroidConfigChooser.ConfigType;
@@ -60,7 +70,7 @@ import javax.microedition.khronos.egl.EGLContext;
 import javax.microedition.khronos.egl.EGLDisplay;
 import javax.microedition.khronos.opengles.GL10;
 
-public class OGLESContext implements JmeContext, GLSurfaceView.Renderer {
+public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTextDialogInput {
 
     private static final Logger logger = Logger.getLogger(OGLESContext.class.getName());
     protected final AtomicBoolean created = new AtomicBoolean(false);
@@ -77,7 +87,6 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer {
     protected boolean autoFlush = true;
     protected AndroidInput view;
     private boolean firstDrawFrame = true;
-
     //protected int minFrameDuration = 1000 / frameRate;  // Set a max FPS of 33
     protected int minFrameDuration = 0;                   // No FPS cap
     /**
@@ -163,7 +172,7 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer {
                     listener.handleError("OpenGL ES 2.0 is not supported on this device", null);
                     return null;
                 }
-                
+
                 // Requesting client version from GLSurfaceView which is extended by
                 // AndroidInput.
                 view.setEGLContextClientVersion(clientOpenGLESVersion);
@@ -211,12 +220,14 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer {
         // Setup unhandled Exception Handler
         if (ctx instanceof AndroidHarness) {
             Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+
                 public void uncaughtException(Thread thread, Throwable thrown) {
                     ((AndroidHarness) ctx).handleError("Exception thrown in " + thread.toString(), thrown);
                 }
             });
         } else {
             Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+
                 public void uncaughtException(Thread thread, Throwable thrown) {
                     listener.handleError("Exception thrown in " + thread.toString(), thrown);
                 }
@@ -245,6 +256,8 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer {
             }
         }
 
+        JmeSystem.setSoftTextDialogInput(this);
+
         needClose.set(false);
         renderable.set(true);
     }
@@ -443,4 +456,67 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer {
     public int getClientOpenGLESVersion() {
         return clientOpenGLESVersion;
     }
+
+    public void requestDialog(final int id, final String title, final String initialValue, final SoftTextDialogInputListener listener) {
+        logger.log(Level.INFO, "requestDialog: title: {0}, initialValue: {1}",
+                new Object[]{title, initialValue});
+
+        JmeAndroidSystem.getActivity().runOnUiThread(new Runnable() {
+
+            @Override
+            public void run() {
+
+                final FrameLayout layoutTextDialogInput = new FrameLayout(JmeAndroidSystem.getActivity());
+                final EditText editTextDialogInput = new EditText(JmeAndroidSystem.getActivity());
+                editTextDialogInput.setWidth(LayoutParams.FILL_PARENT);
+                editTextDialogInput.setHeight(LayoutParams.FILL_PARENT);
+                editTextDialogInput.setPadding(20, 20, 20, 20);
+                editTextDialogInput.setGravity(Gravity.FILL_HORIZONTAL);
+
+                editTextDialogInput.setText(initialValue);
+
+                switch (id) {
+                    case SoftTextDialogInput.TEXT_ENTRY_DIALOG:
+
+                        editTextDialogInput.setInputType(InputType.TYPE_CLASS_TEXT);
+                        break;
+
+                    case SoftTextDialogInput.NUMERIC_ENTRY_DIALOG:
+
+                        editTextDialogInput.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_NUMBER_FLAG_SIGNED);
+                        break;
+
+                    case SoftTextDialogInput.NUMERIC_KEYPAD_DIALOG:
+
+                        editTextDialogInput.setInputType(InputType.TYPE_CLASS_PHONE);
+                        break;
+
+                    default:
+                        break;
+                }
+
+                layoutTextDialogInput.addView(editTextDialogInput);
+
+                AlertDialog dialogTextInput = new AlertDialog.Builder(JmeAndroidSystem.getActivity()).setTitle(title).setView(layoutTextDialogInput).setPositiveButton("OK",
+                        new DialogInterface.OnClickListener() {
+
+                            public void onClick(DialogInterface dialog, int whichButton) {
+                                /* User clicked OK, send COMPLETE action
+                                 * and text */
+                                listener.onSoftText(SoftTextDialogInputListener.COMPLETE, editTextDialogInput.getText().toString());
+                            }
+                        }).setNegativeButton("Cancel",
+                        new DialogInterface.OnClickListener() {
+
+                            public void onClick(DialogInterface dialog, int whichButton) {
+                                /* User clicked CANCEL, send CANCEL action
+                                 * and text */
+                                listener.onSoftText(SoftTextDialogInputListener.CANCEL, editTextDialogInput.getText().toString());
+                            }
+                        }).create();
+
+                dialogTextInput.show();
+            }
+        });
+    }
 }

+ 1 - 1
engine/src/core/com/jme3/input/InputManager.java

@@ -736,7 +736,7 @@ public class InputManager implements RawInputListener {
      *
      */
     public boolean getSimulateMouse() {
-        if (touch != null) {
+        if (touch != null) {           
             return touch.getSimulateMouse();
         } else {
             return false;

+ 13 - 0
engine/src/core/com/jme3/input/SoftTextDialogInput.java

@@ -0,0 +1,13 @@
+package com.jme3.input;
+
+import com.jme3.input.controls.SoftTextDialogInputListener;
+
+public interface SoftTextDialogInput {
+
+    public static int TEXT_ENTRY_DIALOG = 0;
+    public static int NUMERIC_ENTRY_DIALOG = 1;
+    public static int NUMERIC_KEYPAD_DIALOG = 2;
+
+    public void requestDialog(int id, String title, String initialValue, SoftTextDialogInputListener listener);
+
+}

+ 44 - 0
engine/src/core/com/jme3/input/controls/SoftTextDialogInputListener.java

@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2009-2010 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.input.controls;
+
+/**
+ *
+ * @author potterec (aka iwgeric)
+ */
+public interface SoftTextDialogInputListener {
+
+    public static int COMPLETE = 0;
+    public static int CANCEL = 1;
+
+    public void onSoftText(int action, String text);
+}

+ 147 - 136
engine/src/core/com/jme3/system/JmeSystem.java

@@ -1,136 +1,147 @@
-/*
- * Copyright (c) 2009-2010 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.system;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.audio.AudioRenderer;
-import java.io.File;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-public class JmeSystem {
-
-    private static JmeSystemDelegate systemDelegate;
-
-    public static void setSystemDelegate(JmeSystemDelegate systemDelegate) {
-        JmeSystem.systemDelegate = systemDelegate;
-    }
-    
-    public static synchronized File getStorageFolder() {
-        checkDelegate();
-        return systemDelegate.getStorageFolder();
-    }
-
-    public static String getFullName() {
-        checkDelegate();
-        return systemDelegate.getFullName();
-    }
-
-    public static InputStream getResourceAsStream(String name) {
-        checkDelegate();
-        return systemDelegate.getResourceAsStream(name);
-    }
-
-    public static URL getResource(String name) {
-        checkDelegate();
-        return systemDelegate.getResource(name);
-    }
-
-    public static boolean trackDirectMemory() {
-        checkDelegate();
-        return systemDelegate.trackDirectMemory();
-    }
-
-    public static void setLowPermissions(boolean lowPerm) {
-        checkDelegate();
-        systemDelegate.setLowPermissions(lowPerm);
-    }
-
-    public static boolean isLowPermissions() {
-        checkDelegate();
-        return systemDelegate.isLowPermissions();
-    }
-
-    public static AssetManager newAssetManager(URL configFile) {
-        checkDelegate();
-        return systemDelegate.newAssetManager(configFile);
-    }
-
-    public static AssetManager newAssetManager() {
-        checkDelegate();
-        return systemDelegate.newAssetManager();
-    }
-
-    public static boolean showSettingsDialog(AppSettings sourceSettings, final boolean loadFromRegistry) {
-        checkDelegate();
-        return systemDelegate.showSettingsDialog(sourceSettings, loadFromRegistry);
-    }
-
-    public static Platform getPlatform() {
-        checkDelegate();
-        return systemDelegate.getPlatform();
-    }
-
-    public static JmeContext newContext(AppSettings settings, JmeContext.Type contextType) {
-        checkDelegate();
-        return systemDelegate.newContext(settings, contextType);
-    }
-
-    public static AudioRenderer newAudioRenderer(AppSettings settings) {
-        checkDelegate();
-        return systemDelegate.newAudioRenderer(settings);
-    }
-
-    public static void initialize(AppSettings settings) {
-        checkDelegate();
-        systemDelegate.initialize(settings);
-    }
-
-    @SuppressWarnings("unchecked")
-    private static void checkDelegate() {
-        if (systemDelegate == null) {
-            Class<JmeSystemDelegate> systemDelegateClass;
-            try {
-                systemDelegateClass = (Class<JmeSystemDelegate>) Class.forName("com.jme3.system.JmeDesktopSystem");
-                systemDelegate = systemDelegateClass.newInstance();
-            } catch (InstantiationException ex) {
-                Logger.getLogger(JmeSystem.class.getName()).log(Level.SEVERE, "No JmeSystemDelegate specified, cannot instantiate default JmeDesktopSystem:\n{0}", ex);
-            } catch (IllegalAccessException ex) {
-                Logger.getLogger(JmeSystem.class.getName()).log(Level.SEVERE, "No JmeSystemDelegate specified, cannot instantiate default JmeDesktopSystem:\n{0}", ex);
-            } catch (ClassNotFoundException ex) {
-                Logger.getLogger(JmeSystem.class.getName()).log(Level.SEVERE, "No JmeSystemDelegate specified, cannot instantiate default JmeDesktopSystem:\n{0}", ex);
-            }
-        }
-    }
-}
+/*
+ * Copyright (c) 2009-2010 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.system;
+
+import com.jme3.asset.AssetManager;
+import com.jme3.audio.AudioRenderer;
+import com.jme3.input.SoftTextDialogInput;
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class JmeSystem {
+
+    private static JmeSystemDelegate systemDelegate;
+
+    public static void setSystemDelegate(JmeSystemDelegate systemDelegate) {
+        JmeSystem.systemDelegate = systemDelegate;
+    }
+    
+    public static synchronized File getStorageFolder() {
+        checkDelegate();
+        return systemDelegate.getStorageFolder();
+    }
+
+    public static String getFullName() {
+        checkDelegate();
+        return systemDelegate.getFullName();
+    }
+
+    public static InputStream getResourceAsStream(String name) {
+        checkDelegate();
+        return systemDelegate.getResourceAsStream(name);
+    }
+
+    public static URL getResource(String name) {
+        checkDelegate();
+        return systemDelegate.getResource(name);
+    }
+
+    public static boolean trackDirectMemory() {
+        checkDelegate();
+        return systemDelegate.trackDirectMemory();
+    }
+
+    public static void setLowPermissions(boolean lowPerm) {
+        checkDelegate();
+        systemDelegate.setLowPermissions(lowPerm);
+    }
+
+    public static boolean isLowPermissions() {
+        checkDelegate();
+        return systemDelegate.isLowPermissions();
+    }
+
+    public static void setSoftTextDialogInput(SoftTextDialogInput input) {
+        checkDelegate();
+        systemDelegate.setSoftTextDialogInput(input);
+    }
+
+    public static SoftTextDialogInput getSoftTextDialogInput() {
+        checkDelegate();
+        return systemDelegate.getSoftTextDialogInput();
+    }
+
+    public static AssetManager newAssetManager(URL configFile) {
+        checkDelegate();
+        return systemDelegate.newAssetManager(configFile);
+    }
+
+    public static AssetManager newAssetManager() {
+        checkDelegate();
+        return systemDelegate.newAssetManager();
+    }
+
+    public static boolean showSettingsDialog(AppSettings sourceSettings, final boolean loadFromRegistry) {
+        checkDelegate();
+        return systemDelegate.showSettingsDialog(sourceSettings, loadFromRegistry);
+    }
+
+    public static Platform getPlatform() {
+        checkDelegate();
+        return systemDelegate.getPlatform();
+    }
+
+    public static JmeContext newContext(AppSettings settings, JmeContext.Type contextType) {
+        checkDelegate();
+        return systemDelegate.newContext(settings, contextType);
+    }
+
+    public static AudioRenderer newAudioRenderer(AppSettings settings) {
+        checkDelegate();
+        return systemDelegate.newAudioRenderer(settings);
+    }
+
+    public static void initialize(AppSettings settings) {
+        checkDelegate();
+        systemDelegate.initialize(settings);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static void checkDelegate() {
+        if (systemDelegate == null) {
+            Class<JmeSystemDelegate> systemDelegateClass;
+            try {
+                systemDelegateClass = (Class<JmeSystemDelegate>) Class.forName("com.jme3.system.JmeDesktopSystem");
+                systemDelegate = systemDelegateClass.newInstance();
+            } catch (InstantiationException ex) {
+                Logger.getLogger(JmeSystem.class.getName()).log(Level.SEVERE, "No JmeSystemDelegate specified, cannot instantiate default JmeDesktopSystem:\n{0}", ex);
+            } catch (IllegalAccessException ex) {
+                Logger.getLogger(JmeSystem.class.getName()).log(Level.SEVERE, "No JmeSystemDelegate specified, cannot instantiate default JmeDesktopSystem:\n{0}", ex);
+            } catch (ClassNotFoundException ex) {
+                Logger.getLogger(JmeSystem.class.getName()).log(Level.SEVERE, "No JmeSystemDelegate specified, cannot instantiate default JmeDesktopSystem:\n{0}", ex);
+            }
+        }
+    }
+}

+ 149 - 140
engine/src/core/com/jme3/system/JmeSystemDelegate.java

@@ -1,140 +1,149 @@
-/*
- * Copyright (c) 2009-2010 jMonkeyEngine
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
- *   may be used to endorse or promote products derived from this software
- *   without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.jme3.system;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.audio.AudioRenderer;
-import java.io.File;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.logging.Logger;
-
-/**
- *
- * @author Kirill Vainer, normenhansen
- */
-public abstract class JmeSystemDelegate {
-
-    protected final Logger logger = Logger.getLogger(JmeSystem.class.getName());
-    protected boolean initialized = false;
-    protected boolean lowPermissions = false;
-    protected File storageFolder = null;
-
-    public synchronized File getStorageFolder() {
-        if (lowPermissions) {
-            throw new UnsupportedOperationException("File system access restricted");
-        }
-        if (storageFolder == null) {
-            // Initialize storage folder
-            storageFolder = new File(System.getProperty("user.home"), ".jme3");
-            if (!storageFolder.exists()) {
-                storageFolder.mkdir();
-            }
-        }
-        return storageFolder;
-    }
-    
-    public String getFullName() {
-        return JmeVersion.FULL_NAME;
-    }
-
-    public InputStream getResourceAsStream(String name) {
-        return this.getClass().getResourceAsStream(name);
-    }
-
-    public URL getResource(String name) {
-        return this.getClass().getResource(name);
-    }
-
-    public boolean trackDirectMemory() {
-        return false;
-    }
-
-    public void setLowPermissions(boolean lowPerm) {
-        lowPermissions = lowPerm;
-    }
-
-    public boolean isLowPermissions() {
-        return lowPermissions;
-    }
-
-    public abstract AssetManager newAssetManager(URL configFile);
-
-    public abstract AssetManager newAssetManager();
-
-    public abstract boolean showSettingsDialog(AppSettings sourceSettings, boolean loadFromRegistry);
-
-    private boolean is64Bit(String arch) {
-        if (arch.equals("x86")) {
-            return false;
-        } else if (arch.equals("amd64")) {
-            return true;
-        } else if (arch.equals("x86_64")) {
-            return true;
-        } else if (arch.equals("ppc") || arch.equals("PowerPC")) {
-            return false;
-        } else if (arch.equals("ppc64")) {
-            return true;
-        } else if (arch.equals("i386") || arch.equals("i686")) {
-            return false;
-        } else if (arch.equals("universal")) {
-            return false;
-        } else {
-            throw new UnsupportedOperationException("Unsupported architecture: " + arch);
-        }
-    }
-
-    public Platform getPlatform() {
-        String os = System.getProperty("os.name").toLowerCase();
-        String arch = System.getProperty("os.arch").toLowerCase();
-        boolean is64 = is64Bit(arch);
-        if (os.contains("windows")) {
-            return is64 ? Platform.Windows64 : Platform.Windows32;
-        } else if (os.contains("linux") || os.contains("freebsd") || os.contains("sunos")) {
-            return is64 ? Platform.Linux64 : Platform.Linux32;
-        } else if (os.contains("mac os x") || os.contains("darwin")) {
-            if (arch.startsWith("ppc")) {
-                return is64 ? Platform.MacOSX_PPC64 : Platform.MacOSX_PPC32;
-            } else {
-                return is64 ? Platform.MacOSX64 : Platform.MacOSX32;
-            }
-        } else {
-            throw new UnsupportedOperationException("The specified platform: " + os + " is not supported.");
-        }
-    }
-
-    public abstract JmeContext newContext(AppSettings settings, JmeContext.Type contextType);
-
-    public abstract AudioRenderer newAudioRenderer(AppSettings settings);
-
-    public abstract void initialize(AppSettings settings);
-}
+/*
+ * Copyright (c) 2009-2010 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.system;
+
+import com.jme3.asset.AssetManager;
+import com.jme3.audio.AudioRenderer;
+import com.jme3.input.SoftTextDialogInput;
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.logging.Logger;
+
+/**
+ *
+ * @author Kirill Vainer, normenhansen
+ */
+public abstract class JmeSystemDelegate {
+
+    protected final Logger logger = Logger.getLogger(JmeSystem.class.getName());
+    protected boolean initialized = false;
+    protected boolean lowPermissions = false;
+    protected File storageFolder = null;
+    protected SoftTextDialogInput softTextDialogInput = null;
+
+    public synchronized File getStorageFolder() {
+        if (lowPermissions) {
+            throw new UnsupportedOperationException("File system access restricted");
+        }
+        if (storageFolder == null) {
+            // Initialize storage folder
+            storageFolder = new File(System.getProperty("user.home"), ".jme3");
+            if (!storageFolder.exists()) {
+                storageFolder.mkdir();
+            }
+        }
+        return storageFolder;
+    }
+    
+    public String getFullName() {
+        return JmeVersion.FULL_NAME;
+    }
+
+    public InputStream getResourceAsStream(String name) {
+        return this.getClass().getResourceAsStream(name);
+    }
+
+    public URL getResource(String name) {
+        return this.getClass().getResource(name);
+    }
+
+    public boolean trackDirectMemory() {
+        return false;
+    }
+
+    public void setLowPermissions(boolean lowPerm) {
+        lowPermissions = lowPerm;
+    }
+
+    public boolean isLowPermissions() {
+        return lowPermissions;
+    }
+
+    public void setSoftTextDialogInput(SoftTextDialogInput input) {
+        softTextDialogInput = input;
+    }
+    public SoftTextDialogInput getSoftTextDialogInput() {
+        return softTextDialogInput;
+    }
+
+    public abstract AssetManager newAssetManager(URL configFile);
+
+    public abstract AssetManager newAssetManager();
+
+    public abstract boolean showSettingsDialog(AppSettings sourceSettings, boolean loadFromRegistry);
+
+    private boolean is64Bit(String arch) {
+        if (arch.equals("x86")) {
+            return false;
+        } else if (arch.equals("amd64")) {
+            return true;
+        } else if (arch.equals("x86_64")) {
+            return true;
+        } else if (arch.equals("ppc") || arch.equals("PowerPC")) {
+            return false;
+        } else if (arch.equals("ppc64")) {
+            return true;
+        } else if (arch.equals("i386") || arch.equals("i686")) {
+            return false;
+        } else if (arch.equals("universal")) {
+            return false;
+        } else {
+            throw new UnsupportedOperationException("Unsupported architecture: " + arch);
+        }
+    }
+
+    public Platform getPlatform() {
+        String os = System.getProperty("os.name").toLowerCase();
+        String arch = System.getProperty("os.arch").toLowerCase();
+        boolean is64 = is64Bit(arch);
+        if (os.contains("windows")) {
+            return is64 ? Platform.Windows64 : Platform.Windows32;
+        } else if (os.contains("linux") || os.contains("freebsd") || os.contains("sunos")) {
+            return is64 ? Platform.Linux64 : Platform.Linux32;
+        } else if (os.contains("mac os x") || os.contains("darwin")) {
+            if (arch.startsWith("ppc")) {
+                return is64 ? Platform.MacOSX_PPC64 : Platform.MacOSX_PPC32;
+            } else {
+                return is64 ? Platform.MacOSX64 : Platform.MacOSX32;
+            }
+        } else {
+            throw new UnsupportedOperationException("The specified platform: " + os + " is not supported.");
+        }
+    }
+
+    public abstract JmeContext newContext(AppSettings settings, JmeContext.Type contextType);
+
+    public abstract AudioRenderer newAudioRenderer(AppSettings settings);
+
+    public abstract void initialize(AppSettings settings);
+}

+ 114 - 75
engine/src/niftygui/com/jme3/niftygui/InputSystemJme.java

@@ -29,38 +29,41 @@
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-
 package com.jme3.niftygui;
 
 import com.jme3.input.InputManager;
 import com.jme3.input.KeyInput;
 import com.jme3.input.RawInputListener;
+import com.jme3.input.SoftTextDialogInput;
+import com.jme3.input.controls.SoftTextDialogInputListener;
 import com.jme3.input.event.*;
+import com.jme3.system.JmeSystem;
 import de.lessvoid.nifty.Nifty;
 import de.lessvoid.nifty.NiftyInputConsumer;
+import de.lessvoid.nifty.controls.TextField;
+import de.lessvoid.nifty.controls.nullobjects.TextFieldNull;
+import de.lessvoid.nifty.elements.Element;
 import de.lessvoid.nifty.tools.resourceloader.NiftyResourceLoader;
 import de.lessvoid.nifty.input.keyboard.KeyboardInputEvent;
 import de.lessvoid.nifty.spi.input.InputSystem;
 import java.util.ArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 public class InputSystemJme implements InputSystem, RawInputListener {
 
     private final ArrayList<InputEvent> inputQueue = new ArrayList<InputEvent>();
-
     private InputManager inputManager;
-
     private boolean isDragging = false, niftyOwnsDragging = false;
     private boolean pressed = false;
     private int buttonIndex;
     private int x, y;
     private int height;
-
     private boolean shiftDown = false;
-    private boolean ctrlDown  = false;
-
+    private boolean ctrlDown = false;
     private Nifty nifty;
 
-    public InputSystemJme(InputManager inputManager){
+    public InputSystemJme(InputManager inputManager) {
         this.inputManager = inputManager;
     }
 
@@ -75,73 +78,78 @@ public class InputSystemJme implements InputSystem, RawInputListener {
      * @param height The height of the viewport. Used to convert
      * buttom-left origin to upper-left origin.
      */
-    public void setHeight(int height){
+    public void setHeight(int height) {
         this.height = height;
     }
 
-    public void setMousePosition(int x, int y){
+    public void setMousePosition(int x, int y) {
     }
 
-    public void beginInput(){
+    public void beginInput() {
     }
 
-    public void endInput(){
+    public void endInput() {
         boolean result = nifty.update();
     }
 
-    private void onTouchEventQueued(TouchEvent evt, NiftyInputConsumer nic) {  
+    private void onTouchEventQueued(TouchEvent evt, NiftyInputConsumer nic) {
         boolean consumed = false;
 
         x = (int) evt.getX();
         y = (int) (height - evt.getY());
 
-        if (!inputManager.getSimulateMouse()) {
-        switch (evt.getType()) {
-           case DOWN:
-                   consumed = nic.processMouseEvent(x, y, 0, 0, true);
-               isDragging = true;
-               niftyOwnsDragging = consumed;
-               if (consumed){
-                   evt.setConsumed();
-               }
-
-               break;
-
-           case UP:
-               if (niftyOwnsDragging){
-                       consumed = nic.processMouseEvent(x, y, 0, 0, false);
-                   if (consumed){
-                       evt.setConsumed();
-                   }
-               }
-
-               isDragging = false;
-               niftyOwnsDragging = false;
-               break;
-       }
-    }
-    }
-    
+        if (!inputManager.getSimulateMouse()) {            
+            switch (evt.getType()) {
+                case DOWN:
+                    consumed = nic.processMouseEvent(x, y, 0, 0, true);
+                    isDragging = true;
+                    niftyOwnsDragging = consumed;
+                    if (consumed) {
+                        evt.setConsumed();
+                    }
+
+                    break;
+
+                case UP:
+                    if (niftyOwnsDragging) {
+                        consumed = nic.processMouseEvent(x, y, 0, 0, false);
+                        if (consumed) {
+                            evt.setConsumed();
+                        }
+                    }
+
+                    isDragging = false;
+                    niftyOwnsDragging = false;
+
+                    if (consumed) {
+                        processSoftKeyboard();
+                    }
+
+                    break;
+            }
+        }
+    }
+
     private void onMouseMotionEventQueued(MouseMotionEvent evt, NiftyInputConsumer nic) {
         x = evt.getX();
         y = height - evt.getY();
         nic.processMouseEvent(x, y, evt.getDeltaWheel(), buttonIndex, pressed);
 //        if (nic.processMouseEvent(niftyEvt) /*|| nifty.getCurrentScreen().isMouseOverElement()*/){
-            // Do not consume motion events
-            //evt.setConsumed();
+        // Do not consume motion events
+        //evt.setConsumed();
 //        }
     }
 
     private void onMouseButtonEventQueued(MouseButtonEvent evt, NiftyInputConsumer nic) {
         boolean wasPressed = pressed;
         boolean forwardToNifty = true;
-        
+
         buttonIndex = evt.getButtonIndex();
         pressed = evt.isPressed();
-        
+
         // Mouse button raised. End dragging
-        if (wasPressed && !pressed){
-            if (!niftyOwnsDragging){
+        if (wasPressed && !pressed) {
+            if (!niftyOwnsDragging) {
                 forwardToNifty = false;
             }
             isDragging = false;
@@ -149,18 +157,23 @@ public class InputSystemJme implements InputSystem, RawInputListener {
         }
 
         boolean consumed = false;
-        if (forwardToNifty){
+        if (forwardToNifty) {
             consumed = nic.processMouseEvent(x, y, 0, buttonIndex, pressed);
-            if (consumed){
+            if (consumed) {
                 evt.setConsumed();
             }
         }
-        
+
         // Mouse button pressed. Begin dragging
-        if (!wasPressed && pressed){
+        if (!wasPressed && pressed) {
             isDragging = true;
             niftyOwnsDragging = consumed;
         }
+
+        if (consumed && pressed) {
+            processSoftKeyboard();
+        }
+
     }
 
     private void onKeyEventQueued(KeyInputEvent evt, NiftyInputConsumer nic) {
@@ -171,65 +184,91 @@ public class InputSystemJme implements InputSystem, RawInputListener {
         } else if (code == KeyInput.KEY_LCONTROL || code == KeyInput.KEY_RCONTROL) {
             ctrlDown = evt.isPressed();
         }
-        
+
         KeyboardInputEvent keyEvt = new KeyboardInputEvent(code,
-                                                           evt.getKeyChar(),
-                                                           evt.isPressed(),
-                                                           shiftDown,
-                                                           ctrlDown);
+                evt.getKeyChar(),
+                evt.isPressed(),
+                shiftDown,
+                ctrlDown);
 
-        if (nic.processKeyboardEvent(keyEvt)){
+        if (nic.processKeyboardEvent(keyEvt)) {
             evt.setConsumed();
         }
     }
-    
+
     public void onMouseMotionEvent(MouseMotionEvent evt) {
         // Only forward the event if there's actual motion involved.
-        if (inputManager.isCursorVisible() && (evt.getDX() != 0 ||
-                                               evt.getDY() != 0 ||
-                                               evt.getDeltaWheel() != 0)){
+        if (inputManager.isCursorVisible() && (evt.getDX() != 0
+                || evt.getDY() != 0
+                || evt.getDeltaWheel() != 0)) {
             inputQueue.add(evt);
         }
     }
 
     public void onMouseButtonEvent(MouseButtonEvent evt) {
-        if (inputManager.isCursorVisible() && evt.getButtonIndex() >= 0 && evt.getButtonIndex() <= 2){
+        if (inputManager.isCursorVisible() && evt.getButtonIndex() >= 0 && evt.getButtonIndex() <= 2) {
             inputQueue.add(evt);
         }
     }
-    
+
     public void onJoyAxisEvent(JoyAxisEvent evt) {
     }
 
     public void onJoyButtonEvent(JoyButtonEvent evt) {
     }
-    
+
     public void onKeyEvent(KeyInputEvent evt) {
         inputQueue.add(evt);
     }
-    
-    public void onTouchEvent(TouchEvent evt) {     
+
+    public void onTouchEvent(TouchEvent evt) {
         inputQueue.add(evt);
     }
 
     public void forwardEvents(NiftyInputConsumer nic) {
         int queueSize = inputQueue.size();
 
-        for (int i = 0; i < queueSize; i++){
+        for (int i = 0; i < queueSize; i++) {
             InputEvent evt = inputQueue.get(i);
-            if (evt instanceof MouseMotionEvent){
-                onMouseMotionEventQueued( (MouseMotionEvent)evt, nic);
-            }else if (evt instanceof MouseButtonEvent){
-                onMouseButtonEventQueued( (MouseButtonEvent)evt, nic);
-            }else if (evt instanceof KeyInputEvent){
-                onKeyEventQueued( (KeyInputEvent)evt, nic);
-            }else if (evt instanceof TouchEvent){
-                onTouchEventQueued( (TouchEvent)evt, nic);
+            if (evt instanceof MouseMotionEvent) {
+                onMouseMotionEventQueued((MouseMotionEvent) evt, nic);
+            } else if (evt instanceof MouseButtonEvent) {
+                onMouseButtonEventQueued((MouseButtonEvent) evt, nic);
+            } else if (evt instanceof KeyInputEvent) {
+                onKeyEventQueued((KeyInputEvent) evt, nic);
+            } else if (evt instanceof TouchEvent) {
+                onTouchEventQueued((TouchEvent) evt, nic);
             }
         }
 
         inputQueue.clear();
     }
-    
-    
+
+    private void processSoftKeyboard() {
+        SoftTextDialogInput softTextDialogInput = JmeSystem.getSoftTextDialogInput();
+        if (softTextDialogInput != null) {
+
+            Element element = nifty.getCurrentScreen().getFocusHandler().getKeyboardFocusElement();
+            if (element != null) {
+                final TextField textField = element.getNiftyControl(TextField.class);
+                if (textField != null && !(textField instanceof TextFieldNull)) {
+                    Logger.getLogger(InputSystemJme.class.getName()).log(Level.INFO, "Current TextField: {0}", textField.getId());
+                    String initialValue = textField.getText();
+                    if (initialValue == null) {
+                        initialValue = "";
+                    }
+
+                    softTextDialogInput.requestDialog(SoftTextDialogInput.TEXT_ENTRY_DIALOG, "Enter Text", initialValue, new SoftTextDialogInputListener() {
+
+                        public void onSoftText(int action, String text) {
+                            if (action == SoftTextDialogInputListener.COMPLETE) {
+                                textField.setText(text);
+                            }
+                        }
+                    });
+                }
+            }
+        }
+
+    }
 }