Browse Source

URL: http://jmonkeyengine.org/groups/contribution-depot-jme3/forum/topic/add-double-click-enter-support-for-testchooser/
Add double click, enter, multiple selection support for TestChooser

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

mul..va 14 years ago
parent
commit
df8680bf17
1 changed files with 84 additions and 48 deletions
  1. 84 48
      engine/src/test/jme3test/TestChooser.java

+ 84 - 48
engine/src/test/jme3test/TestChooser.java

@@ -32,7 +32,6 @@
 
 package jme3test;
 
-import com.jme3.app.Application;
 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
@@ -40,10 +39,15 @@ import java.awt.HeadlessException;
 import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 import java.io.File;
 import java.io.FileFilter;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.JarURLConnection;
@@ -58,24 +62,17 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.zip.ZipEntry;
 
-import javax.swing.DefaultListModel;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.ListModel;
-import javax.swing.SwingUtilities;
-import javax.swing.UIManager;
+import javax.swing.*;
 import javax.swing.border.EmptyBorder;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 
+import com.jme3.app.Application;
+import com.jme3.app.SimpleApplication;
+import com.jme3.system.JmeContext;
+
 
 /**
  * Class with a main method that displays a dialog to choose any jME demo to be
@@ -90,13 +87,14 @@ public class TestChooser extends JDialog {
     /**
      * Only accessed from EDT
      */
-    private Class<?> selectedClass = null;
+    private Object[] selectedClass = null;
+    private boolean showSetting = true;
 
     /**
      * Constructs a new TestChooser that is initially invisible.
      */
     public TestChooser() throws HeadlessException {
-        super((JFrame) null, "TestChooser", true);
+        super((JFrame) null, "TestChooser");
     }
 
     /**
@@ -252,7 +250,7 @@ public class TestChooser extends JDialog {
         };
     }
 
-    private void startApp(final Class<?> appClass){
+    private void startApp(final Object[] appClass){
         if (appClass == null){
             JOptionPane.showMessageDialog(rootPane,
                                           "Please select a test from the list",
@@ -261,30 +259,47 @@ public class TestChooser extends JDialog {
             return;
         }
 
-        final Object app;
-        try {
-            app = appClass.newInstance();
-            final Method mainMethod = appClass.getMethod("main", (new String[0]).getClass());
             new Thread(new Runnable(){
                 public void run(){
-                    try {
-                        mainMethod.invoke(app, new Object[]{new String[0]});
-                    } catch (IllegalAccessException ex) {
-                        logger.log(Level.SEVERE, "Cannot access constructor: "+appClass.getName(), ex);
-                    } catch (IllegalArgumentException ex) {
-                        logger.log(Level.SEVERE, "main() had illegal argument: "+appClass.getName(), ex);
-                    } catch (InvocationTargetException ex) {
-                        logger.log(Level.SEVERE, "main() method had exception: "+appClass.getName(), ex);
-                    }
+                    for (int i = 0; i < appClass.length; i++) {
+                	    Class<?> clazz = (Class)appClass[i];
+                		try {
+                			Object app = clazz.newInstance();
+                			final Method settingMethod = clazz.getMethod("setShowSettings", boolean.class);
+                			settingMethod.invoke(app, showSetting);
+                			final Method mainMethod = clazz.getMethod("start", null);
+                			mainMethod.invoke(app, null);
+                			// wait for destroy
+                			Field contextField = Application.class.getDeclaredField("context");
+                			contextField.setAccessible(true);
+                			JmeContext context = null; 
+                			while (context == null) {
+                			    context = (JmeContext) contextField.get(app);
+                			    Thread.sleep(100);
+                			}
+                			while (!context.isCreated()) {
+                			    Thread.sleep(100);
+                			}
+                			while (context.isCreated()) {
+                			    Thread.sleep(100);
+                			}
+                		} catch (IllegalAccessException ex) {
+                			logger.log(Level.SEVERE, "Cannot access constructor: "+clazz.getName(), ex);
+                		} catch (IllegalArgumentException ex) {
+                			logger.log(Level.SEVERE, "main() had illegal argument: "+clazz.getName(), ex);
+                		} catch (InvocationTargetException ex) {
+                			logger.log(Level.SEVERE, "main() method had exception: "+clazz.getName(), ex);
+                		} catch (InstantiationException ex) {
+                			logger.log(Level.SEVERE, "Failed to create app: "+clazz.getName(), ex);
+                		} catch (NoSuchMethodException ex){
+                			logger.log(Level.SEVERE, "Test class doesn't have main method: "+clazz.getName(), ex);
+                		} catch (Exception ex) {
+                		    logger.log(Level.SEVERE, "Cannot start test: "+clazz.getName(), ex);
+                            ex.printStackTrace();
+                        }
+                	}
                 }
             }).start();
-        } catch (InstantiationException ex) {
-            logger.log(Level.SEVERE, "Failed to create app: "+appClass.getName(), ex);
-        } catch (IllegalAccessException ex) {
-            logger.log(Level.SEVERE, "Cannot access constructor: "+appClass.getName(), ex);
-        } catch (NoSuchMethodException ex){
-            logger.log(Level.SEVERE, "Test class doesn't have main method: "+appClass.getName(), ex);
-        }
     }
 
     /**
@@ -301,6 +316,7 @@ public class TestChooser extends JDialog {
         mainPanel.setBorder(new EmptyBorder(10, 10, 10, 10));
 
         final FilteredJList list = new FilteredJList();
+        list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
         DefaultListModel model = new DefaultListModel();
         for (Class c : classes) {
             model.addElement(c);
@@ -313,9 +329,26 @@ public class TestChooser extends JDialog {
         list.getSelectionModel().addListSelectionListener(
                 new ListSelectionListener() {
                     public void valueChanged(ListSelectionEvent e) {
-                        selectedClass = (Class) list.getSelectedValue();
+                        selectedClass = list.getSelectedValues();
                     }
                 });
+        list.addMouseListener(new MouseAdapter() {
+            public void mouseClicked(MouseEvent e) {
+                if (e.getClickCount() == 2 && selectedClass != null) {
+                    startApp(selectedClass);
+                }
+            }
+        });
+        list.addKeyListener(new KeyAdapter() {
+            @Override
+            public void keyTyped(KeyEvent e) {
+                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+                    startApp(selectedClass);
+                } else if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
+                    dispose();
+                }
+            }
+        });
 
         final JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
         mainPanel.add(buttonPanel, BorderLayout.PAGE_END);
@@ -327,7 +360,6 @@ public class TestChooser extends JDialog {
         okButton.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
                 startApp(selectedClass);
-                dispose();
             }
         });
 
@@ -369,6 +401,9 @@ public class TestChooser extends JDialog {
                 }
             }
             super.setModel(v);
+            if (v.getSize() == 1) {
+                setSelectedIndex(0);
+            }
             revalidate();
         }
 
@@ -409,11 +444,7 @@ public class TestChooser extends JDialog {
             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
         } catch (Exception e) {
         }
-        SwingUtilities.invokeLater(new Runnable(){
-            public void run(){
-                new TestChooser().start(args);
-            }
-        });
+        new TestChooser().start(args);
     }
 
     protected void start(String[] args) {
@@ -450,14 +481,19 @@ public class TestChooser extends JDialog {
         });
         jtf.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
-                if (classes.getModel().getSize() == 1) {
-                    selectedClass = (Class) classes.getModel().getElementAt(0);
-                    TestChooser.this.dispose();
-                }
+                selectedClass = classes.getSelectedValues();
+                startApp(selectedClass);
+            }
+        });
+        final JCheckBox showSettingCheck = new JCheckBox("Show Setting");
+        showSettingCheck.setSelected(true);
+        showSettingCheck.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent e) {
+                showSetting = showSettingCheck.isSelected();
             }
         });
-
         search.add(jtf);
+        search.add(showSettingCheck);
         return search;
     }
 }