/* * Created on 23.04.2009 * */ package org.jdesktop.swingx.event; import java.awt.Component; import java.awt.GraphicsEnvironment; import java.awt.KeyboardFocusManager; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.reflect.InvocationTargetException; import java.util.Date; import java.util.logging.Logger; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.border.TitledBorder; import org.jdesktop.swingx.InteractiveTestCase; import org.jdesktop.swingx.JXDatePicker; import org.jdesktop.swingx.JXFrame; import org.jdesktop.swingx.JXPanel; import org.jdesktop.swingx.SwingXUtilities; import org.jdesktop.test.PropertyChangeReport; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @Ignore("automated testing fails") @RunWith(JUnit4.class) public class CompoundFocusListenerTest extends InteractiveTestCase { @SuppressWarnings("unused") private static final Logger LOG = Logger .getLogger(CompoundFocusListenerTest.class.getName()); public static void main(String[] args) { CompoundFocusListenerTest test = new CompoundFocusListenerTest(); // KEEP this is global state - uncomment for debug painting completely // UIManager.put(CalendarHeaderHandler.uiControllerID, "org.jdesktop.swingx.plaf.basic.SpinningCalendarHeaderHandler"); // UIManager.put(SpinningCalendarHeaderHandler.FOCUSABLE_SPINNER_TEXT, Boolean.TRUE); // UIManager.put("JXDatePicker.forceZoomable", Boolean.TRUE); try { test.runInteractiveTests(); } catch (Exception e) { e.printStackTrace(); } } public void interactiveCompoundFocusedProperty() { JXPanel panel = new JXPanel(); panel.setName("plain-panel"); // add some components inside panel.add(new JTextField("something to .... focus")); JXDatePicker picker = new JXDatePicker(new Date()); picker.setName("picker"); panel.add(picker); JComboBox combo = new JComboBox(new Object[] {"dooooooooo", 1, 2, 3, 4 }); combo.setEditable(true); panel.add(new JButton("something else to ... focus")); panel.add(combo); panel.setBorder(new TitledBorder("has focus dispatcher")); // register the compound dispatcher CompoundFocusListener focusDispatcher = new CompoundFocusListener(picker); PropertyChangeListener l = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { LOG.info("focused on picker " + evt.getNewValue()); }}; focusDispatcher.addPropertyChangeListener(l); JComponent box = Box.createVerticalBox(); box.add(panel); showInFrame(box, "CompoundFocusListener (on datePicker)"); } @Test(expected = NullPointerException.class) public void testNullRoot() { new CompoundFocusListener(null); } @Test public void testFocusedInitialFalse() { JComboBox field = new JComboBox(); field.setEditable(true); assertFalse("sanity: combo not focused", field.hasFocus()); CompoundFocusListener l = new CompoundFocusListener(field); assertEquals(field.hasFocus(), l.isFocused()); } @Test public void testFocusedInitialTrue() throws InterruptedException, InvocationTargetException { // This test will not work in a headless configuration. if (GraphicsEnvironment.isHeadless()) { LOG.fine("cannot run test - headless environment"); return; } final JXDatePicker picker = getRealizedDatePicker(); picker.requestFocusInWindow(); SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner(); assertTrue("sanity: focus transfered into picker hierarchy", SwingXUtilities.isDescendingFrom(focusOwner, picker)); CompoundFocusListener l = new CompoundFocusListener(picker); assertTrue("listener must take initial focused state ", l.isFocused()); } }); } @Test public void testReleaseRemovesListeners() { CompoundFocusListener l = new CompoundFocusListener(new JXDatePicker()); final PropertyChangeReport report = new PropertyChangeReport(); l.addPropertyChangeListener(report); l.release(); assertRemoved(report, l.getPropertyChangeListeners()); } private void assertRemoved(PropertyChangeReport report, PropertyChangeListener[] propertyChangeListeners) { for (PropertyChangeListener l : propertyChangeListeners) { assertNotSame("property change listener must have been removed", report, l); } } /** * Test no property change fired after release. * * @throws InterruptedException * @throws InvocationTargetException */ @Test public void testRelease() throws InterruptedException, InvocationTargetException { // This test will not work in a headless configuration. if (GraphicsEnvironment.isHeadless()) { LOG.fine("cannot run test - headless environment"); return; } JXDatePicker picker = getRealizedDatePicker(); Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner(); assertFalse("sanity: initial focus must not be in picker", SwingXUtilities.isDescendingFrom(focusOwner, picker)); CompoundFocusListener l = new CompoundFocusListener(picker); final PropertyChangeReport report = new PropertyChangeReport(); l.addPropertyChangeListener(report); l.release(); picker.requestFocusInWindow(); SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { assertEquals(0, report.getEventCount("focused")); } }); } /** * Test property change fired on focusGained. * * @throws InterruptedException * @throws InvocationTargetException */ @Test public void testFireFocusedProperty() throws InterruptedException, InvocationTargetException { // This test will not work in a headless configuration. if (GraphicsEnvironment.isHeadless()) { LOG.fine("cannot run test - headless environment"); return; } JXDatePicker picker = getRealizedDatePicker(); Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner(); assertFalse("sanity: initial focus must not be in picker", SwingXUtilities.isDescendingFrom(focusOwner, picker)); CompoundFocusListener l = new CompoundFocusListener(picker); final PropertyChangeReport report = new PropertyChangeReport(); l.addPropertyChangeListener(report); picker.requestFocusInWindow(); SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { assertEquals(1, report.getEventCount("focused")); } }); } /** * @return */ protected JXDatePicker getRealizedDatePicker() { JXFrame frame = new JXFrame(); final JXDatePicker picker = new JXDatePicker(); frame.add(new JTextField(10)); frame.add(picker); frame.add(new JTextField(10)); frame.pack(); frame.setVisible(true); return picker; } }