/*
* Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* California 95054, U.S.A. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jdesktop.swingx;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Locale;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import org.junit.Ignore;
import org.junit.Test;
/**
* Simple tests to ensure that the {@code JXTaskPane} can be instantiated and
* displayed.
*
* @author rah003
*/
public class JXTaskPaneVisualCheck extends InteractiveTestCase {
@SuppressWarnings("unused")
private static final Logger LOG = Logger
.getLogger(JXTaskPaneVisualCheck.class.getName());
public JXTaskPaneVisualCheck() {
super("JXLoginPane Test");
}
public static void main(String[] args) throws Exception {
JXTaskPaneVisualCheck test = new JXTaskPaneVisualCheck();
try {
// test.runInteractiveTests();
// test.runInteractiveTests("interactiveDisplay");
// test.runInteractiveTests("interactiveMnemonic");
// test.runInteractiveTests("interactiveEnablingTest");
test.runInteractive("Scrolls");
} catch (Exception e) {
System.err.println("exception when executing interactive tests:");
e.printStackTrace();
}
}
/**
* Issue #1572-swingx: taskPane scrollsOnExpand has no effect Regression:
* reported to work in 1.6.3, broken in 1.6.5-1
*
* Reason is outdated logic in BasicTaskPaneUI (somehow survived the expanded vs.
* collapsed property change and animated).
*
* Quick fix in application code is to register a custom listener.
*
*/
public void interactiveScrollsOnExpand() {
JXTaskPane pane = new JXTaskPane();
pane.add(new JLabel("just me!"));
pane.add(new JLabel("just me!"));
pane.add(new JLabel("just me!"));
pane.add(new JLabel("just me!"));
pane.add(new JLabel("just me!"));
pane.add(new JLabel("just me!"));
JXTaskPane other = new JXTaskPane();
other.setCollapsed(true);
other.setScrollOnExpand(true);
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
other.add(new JButton("lazy me!"));
// hot fix: add propertyChangeListener that triggers the scrolling
PropertyChangeListener l = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
final JXTaskPane pane = (JXTaskPane) evt.getSource();
if (!pane.isCollapsed() && pane.isScrollOnExpand()) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
pane.scrollRectToVisible(pane.getBounds());
}
});
}
}
};
other.addPropertyChangeListener("collapsed", l);
JXTaskPane yetAnother = new JXTaskPane();
yetAnother.add(new JScrollPane(new JXTable(20, 3)));
yetAnother.setCollapsed(true);
yetAnother.setScrollOnExpand(true);
JXTaskPaneContainer container = new JXTaskPaneContainer();
container.add(pane);
container.add(other);
container.add(yetAnother);
showWithScrollingInFrame(container, "scrollOnExpand");
}
public void interactiveMnemonic() {
JXTaskPane pane = new JXTaskPane();
pane.setTitle("Use Me");
pane.setMnemonic(KeyEvent.VK_U);
pane.setForeground(Color.RED);
pane.setBackground(Color.YELLOW);
pane.add(new JLabel("another"));
pane.add(new JButton("wow!!"));
JXTaskPaneContainer container = new JXTaskPaneContainer();
container.add(pane);
showInFrame(container, "Mnemonic Test", true);
}
public void interactiveColors() {
JXTaskPane pane = new JXTaskPane();
pane.setTitle("just something....");
pane.setForeground(Color.RED);
pane.setBackground(Color.YELLOW);
pane.add(new JLabel("another"));
pane.add(new JButton("wow!!"));
JXTaskPaneContainer container = new JXTaskPaneContainer();
container.add(pane);
showInFrame(container, "background", true);
}
/**
* Issue #249-swingx JXTaskPane looks ugly under different default LaFs
*
*/
public void interactiveDisplay() {
// PENDING JW: removed while fixing #1186-swingx (no dependency on sun packages)
// revisit: why do we do this at all?
// sun.awt.AppContext.getAppContext().put("JComponent.defaultLocale", Locale.FRANCE);
JXTaskPane panel = new JXTaskPane();
panel.setTitle("Hi there");
panel.setForeground(Color.RED);
panel.setFont(new Font("tahoma",Font.BOLD, 72));
panel.add(new JLabel("Hi there again"));
showInFrame(panel, "JXTaskPane interactive", true);
}
/**
* Ensure that resizing scroll pane's properly enables/disables scrollbars.
* <p>
* SwingX issue #740
*/
public void interactiveJScrollPaneTest() {
JXTaskPane panel = new JXTaskPane();
JXTable table = new JXTable(10, 15);
table.setHorizontalScrollEnabled(true);
panel.add(new JScrollPane(table));
showInFrame(panel, "Ensure scrolling works");
}
/**
* Add enabled/disabled state to JXTaskPane.
* <p>
* SwingX issue #400
*/
public void interactiveEnablingTest() {
final JXTaskPane pane = new JXTaskPane();
pane.add(new AbstractAction("Disable") {
@Override
public void actionPerformed(ActionEvent e) {
pane.setEnabled(false);
System.out.println(pane.isEnabled());
}
});
pane.add(new JButton("wow!!"));
JXTaskPaneContainer container = new JXTaskPaneContainer();
container.add(pane);
showInFrame(container, "Ensure enabling/disabling updates");
}
@Override
protected void createAndAddMenus(JMenuBar menuBar, final JComponent component) {
super.createAndAddMenus(menuBar, component);
JMenu menu = new JMenu("Locales");
menu.add(new AbstractAction("Change Locale") {
public void actionPerformed(ActionEvent e) {
if (component.getLocale() == Locale.FRANCE) {
component.setLocale(Locale.ENGLISH);
} else {
component.setLocale(Locale.FRANCE);
}
}});
menuBar.add(menu);
}
// continue to ignore, until the test is fully converted to visual
@Test @Ignore
public void testAnimationListeners() throws Exception {
JXTaskPane taskPane = new JXTaskPane();
// start with a not expanded or animated taskPane
taskPane.setAnimated(false);
taskPane.setCollapsed(true);
assertTrue(taskPane.isCollapsed());
class ListenForEvents implements PropertyChangeListener {
private boolean expandedEventReceived;
private boolean collapsedEventReceived;
private int animationStart;
public void propertyChange(java.beans.PropertyChangeEvent evt) {
if ("expanded".equals(evt.getNewValue())) {
expandedEventReceived = true;
} else if ("collapsed".equals(evt.getNewValue())) {
collapsedEventReceived = true;
} else if ("reinit".equals(evt.getNewValue())) {
animationStart++;
}
}
}
ListenForEvents listener = new ListenForEvents();
// register a listener on the animation
taskPane.addPropertyChangeListener("collapsed",
listener);
taskPane.setAnimated(true);
// expand the taskPane and...
taskPane.setCollapsed(false);
// ...wait until listener has been notified
while (!listener.expandedEventReceived) { Thread.sleep(100); }
// collapse the taskPane and...
// ...wait until listener has been notified
taskPane.setCollapsed(true);
while (!listener.collapsedEventReceived) { Thread.sleep(100); }
assertEquals(2, listener.animationStart);
}
/**
* Do nothing, make the test runner happy
* (would output a warning without a test fixture).
*
*/
public void testDummy() {
}
}