Title: [731] trunk/extensions/swing/src/java/org/jbehave/threaded/swing: [EK] Focusing is event-driven too! This version only as broken as it already was, next step to fix it.

Diff

Modified: trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/DefaultWindowWrapperBehaviour.java (730 => 731)

--- trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/DefaultWindowWrapperBehaviour.java	2007-05-23 12:48:52 UTC (rev 730)
+++ trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/DefaultWindowWrapperBehaviour.java	2007-05-24 17:13:26 UTC (rev 731)
@@ -7,6 +7,7 @@
 
 import javax.swing.Action;
 import javax.swing.JButton;
+import javax.swing.JComboBox;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 import javax.swing.JTextArea;
@@ -77,10 +78,44 @@
     		
     		ensureThat(textField.getText(), eq("Text1"));
     		ensureThat(textArea.getText(), eq("Text2"));
+            
         } finally {
             wrapper.closeWindow();
         }
 	}
+    
+    public void shouldEnterTextIntoAComboBox() throws Exception {
+        shouldEnterTextIntoComboBox(false);
+    }
+    
+//    public void shouldEnterTextIntoAnEditableComboBox() throws Exception {
+//        shouldEnterTextIntoComboBox(true);
+//    }
+
+    private void shouldEnterTextIntoComboBox(boolean editable) throws ComponentFinderException, TimeoutException {
+        checkForHeadless();
+        DefaultWindowWrapper wrapper = new DefaultWindowWrapper(AFrame.FRAME_NAME);
+        
+        try {
+            AFrame frame = new AFrame();
+            
+            JComboBox comboBox = new JComboBox(new Object[] {"horse", "cow", "sheep"});
+            comboBox.setName("a.combobox");
+            comboBox.setEditable(editable);
+            frame.getContentPane().setLayout(new FlowLayout());
+            frame.getContentPane().add(comboBox);
+            frame.pack();
+            frame.setVisible(true);
+            
+            wrapper.enterText("a.combobox", "cow");
+            
+            ensureThat(comboBox.getSelectedItem(), eq("cow"));
+            
+            
+        } finally {
+            wrapper.closeWindow();
+        }
+    }
 	
 	public void shouldFindComponent() throws ComponentFinderException, TimeoutException  {
 	    checkForHeadless();
@@ -164,7 +199,7 @@
         new HeadlessChecker().check();
     }
 
-    public class AFrame extends JFrame {
+    public static class AFrame extends JFrame {
         private static final String FRAME_NAME = "a.window";
         private static final String ACTION_KEY = "AFrame.action";
         
@@ -182,4 +217,20 @@
             this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
         }
     }
+    
+    public static void main(String[] args) {
+            AFrame frame = new AFrame();
+            
+            JComboBox comboBox = new JComboBox(new Object[] {"horse", "cow", "sheep"});
+            comboBox.setName("a.combobox");
+            comboBox.setEditable(true);
+            
+            frame.getContentPane().setLayout(new FlowLayout());
+            
+            frame.getContentPane().add(comboBox);
+            frame.pack();
+            
+            
+            frame.setVisible(true);
+    }
 }

Added: trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/FocuserBehaviour.java (0 => 731)

--- trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/FocuserBehaviour.java	                        (rev 0)
+++ trunk/extensions/swing/src/behaviour/org/jbehave/threaded/swing/FocuserBehaviour.java	2007-05-24 17:13:26 UTC (rev 731)
@@ -0,0 +1,76 @@
+package org.jbehave.threaded.swing;
+
+import java.awt.FlowLayout;
+
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+import org.jbehave.core.mock.UsingMatchers;
+
+public class FocuserBehaviour extends UsingMatchers {
+
+    public void shouldRequestFocusOnAComponent() {
+        checkForHeadless();
+        Focuser focuser = new Focuser();
+        AFrame frame = new AFrame();            
+        
+        try {
+
+            JComboBox comboBox = new JComboBox(new Object[] {"horse", "cow", "sheep"});
+            comboBox.setName("a.combobox");
+            frame.getContentPane().setLayout(new FlowLayout());
+            frame.getContentPane().add(comboBox);
+            frame.pack();
+            frame.setVisible(true);
+            
+            focuser.requestFocusOn(comboBox);
+            
+            ensureThat(comboBox.hasFocus());
+        } finally {
+            frame.dispose();
+        }
+    }
+    
+    public void shouldNotChangeAnythingIfFocusAlreadyOnAComponent() {
+        checkForHeadless();
+        Focuser focuser = new Focuser();
+        AFrame frame = new AFrame();            
+        
+        try {
+
+            JComboBox comboBox = new JComboBox(new Object[] {"horse", "cow", "sheep"});
+            comboBox.setName("a.combobox");
+            frame.getContentPane().setLayout(new FlowLayout());
+            frame.getContentPane().add(comboBox);
+            frame.pack();
+            frame.setVisible(true);
+            
+            focuser.requestFocusOn(comboBox);
+            focuser.requestFocusOn(comboBox);
+            
+            ensureThat(comboBox.hasFocus());
+        } finally {
+            frame.dispose();
+        }
+    }
+    
+    public static class AFrame extends JFrame {
+        private static final String FRAME_NAME = "a.window";
+        
+        private JPanel contentPanel = new JPanel();
+        public AFrame() {
+            setName(FRAME_NAME);
+            setContentPane(contentPanel);
+
+            this.pack();
+            this.setVisible(true);
+            
+            this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+        }
+    }
+
+    private void checkForHeadless() {
+        new HeadlessChecker().check();
+    }    
+}
\ No newline at end of file

Added: trunk/extensions/swing/src/java/org/jbehave/threaded/swing/Focuser.java (0 => 731)

--- trunk/extensions/swing/src/java/org/jbehave/threaded/swing/Focuser.java	                        (rev 0)
+++ trunk/extensions/swing/src/java/org/jbehave/threaded/swing/Focuser.java	2007-05-24 17:13:26 UTC (rev 731)
@@ -0,0 +1,41 @@
+package org.jbehave.threaded.swing;
+
+import java.awt.Component;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+
+public class Focuser {
+
+    public void requestFocusOn(Component component) {
+        if (!component.hasFocus()) {
+            QueueingFocusListener focusListener = new QueueingFocusListener(component);
+            component.requestFocus();
+            try {
+                focusListener.waitForEvent();
+            } finally {
+                focusListener.removeSelfFromComponent();
+            }
+        }
+    }
+
+    private class QueueingFocusListener extends QueueingAdapter implements FocusListener {
+        
+        public QueueingFocusListener(Component component) {
+            super(component, "FocusEvent");
+        }
+        
+        public void focusGained(FocusEvent e) {
+            eventOccurred();
+        }
+
+        public void focusLost(FocusEvent e) {}
+        
+        protected void addSelfToComponent() {
+            component.addFocusListener(this);
+        }
+
+        protected void removeSelfFromComponent() {
+            component.removeFocusListener(this);
+        }
+    }   
+}

Added: trunk/extensions/swing/src/java/org/jbehave/threaded/swing/QueueingAdapter.java (0 => 731)

--- trunk/extensions/swing/src/java/org/jbehave/threaded/swing/QueueingAdapter.java	                        (rev 0)
+++ trunk/extensions/swing/src/java/org/jbehave/threaded/swing/QueueingAdapter.java	2007-05-24 17:13:26 UTC (rev 731)
@@ -0,0 +1,38 @@
+package org.jbehave.threaded.swing;
+
+import java.awt.Component;
+
+import org.jbehave.core.threaded.QueuedObjectHolder;
+import org.jbehave.core.threaded.TimeoutException;
+
+abstract class QueueingAdapter {
+
+    private QueuedObjectHolder holder = new QueuedObjectHolder();
+    private Idler idler = new Idler();
+    protected final Component component;
+    private String eventType;
+
+    public QueueingAdapter(Component component, String eventType) {
+        this.component = component;
+        this.eventType = eventType;
+        addSelfToComponent();
+    }
+
+    public void waitForEvent() {
+        try {
+            holder.get(1000);
+        } catch (TimeoutException e) {
+            throw new RuntimeException("Expected " + eventType + " on component " + component.getName() + " was not received");
+        }
+        idler.waitForIdle();
+    }
+
+    protected abstract void addSelfToComponent();
+    
+    protected abstract void removeSelfFromComponent();
+    
+    public void eventOccurred() {
+        holder.set(new Object());
+    }
+
+}


To unsubscribe from this list please visit:

http://xircles.codehaus.org/manage_email

Reply via email to