/*
* 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.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Locale;
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.JPanel;
import javax.swing.JSplitPane;
import org.jdesktop.swingx.action.AbstractActionExt;
import org.jdesktop.swingx.painter.Painter;
/**
* Simple tests to ensure that the {@code JXTaskPane} can be instantiated and
* displayed.
*
* @author rah003
*/
public class JXTaskPaneContainerVisualCheck extends InteractiveTestCase {
public JXTaskPaneContainerVisualCheck() {
super("JXLoginPane Test");
}
public static void main(String[] args) throws Exception {
// setLookAndFeel("Nimbus");
// setSystemLF(true);
JXTaskPaneContainerVisualCheck test = new JXTaskPaneContainerVisualCheck();
try {
test.runInteractiveTests();
// test.runInteractiveTests("interactive.*Color.*");
} catch (Exception e) {
System.err.println("exception when executing interactive tests:");
e.printStackTrace();
}
}
/**
* Tweak JXTaskPaneContainer into an accordion-like component
*/
public void interactiveAccordion() {
JXTaskPaneContainer container = new JXTaskPaneContainer() {
private JXTaskPane current;
private PropertyChangeListener expansionListener;
/**
* @inherited <p>
*/
@Override
protected void addImpl(Component comp, Object constraints, int index) {
super.addImpl(comp, constraints, index);
if (comp instanceof JXTaskPane) {
grabExpansionControl((JXTaskPane) comp);
}
}
private void grabExpansionControl(JXTaskPane comp) {
if (current != null) {
comp.setCollapsed(true);
} else {
current = comp;
comp.setCollapsed(false);
}
comp.addPropertyChangeListener("collapsed",
getExpansionListener());
}
private void updateCurrentTaskPane(JXTaskPane source) {
if (source != current) {
if (!source.isCollapsed()) {
if (current != null) {
current.setCollapsed(true);
}
current = source;
}
}
}
private PropertyChangeListener createExpansionListener() {
PropertyChangeListener l = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
// TODO Auto-generated method stub
updateCurrentTaskPane((JXTaskPane) evt.getSource());
}
};
return l;
}
private PropertyChangeListener getExpansionListener() {
if (expansionListener == null) {
expansionListener = createExpansionListener();
}
return expansionListener;
}
};
((VerticalLayout) container.getLayout()).setGap(0);
for (int i = 0; i < 5; i++) {
addTaskPane(container);
}
showWithScrollingInFrame(container, "");
}
private void addTaskPane(JXTaskPaneContainer container) {
JXTaskPane first = new JXTaskPane("pane " + container.getComponentCount());
first.setAnimated(false);
fillTaskPane(first);
container.add(first);
}
/**
* Requirement: color of parent, that is transparent.
* Issue ??-swingx: Not respected in Windows - that's because
* the windows addon installs a background painter (container is-a JXPanel).
* <p>
* Actually, it was slightly different: use same color as laf-background of
* other components, what ever that means. Nevertheless, the issue here
* is that there are two different mechanisms to define background
* (plain color or painter) by the laf, should be made consistent.
*/
public void interactiveContainerColor() {
JXTaskPaneContainer container = new JXTaskPaneContainer();
container.setOpaque(false);
Painter<?> nullPainter = new Painter<Object>() {
@Override
public void paint(Graphics2D g, Object object, int width, int height) {
}
};
container.setBackgroundPainter(nullPainter);
addTaskPane(container);
JXTaskPane second = new JXTaskPane();
fillTaskPane(second);
showWithScrollingInFrame(container, "transparent");
container.getParent().setBackground(Color.CYAN);
assertTrue(container.getParent().isOpaque());
}
public void interactiveGap() {
JXTaskPaneContainer container = new JXTaskPaneContainer();
addTaskPane(container);
addTaskPane(container);
showWithScrollingInFrame(container, "custom gap");
}
public void interactiveGetUINPE() {
showWithScrollingInFrame(new AbstractLBContentPanel<Object>("hi") {}, "custom gap");
}
private void fillTaskPane(JXTaskPane first) {
first.add(new AbstractActionExt("some") {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
});
first.add(new AbstractActionExt("other") {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
});
}
/**
* Ensure that removing a task pane properly repaints the container.
* <p>
* SwingX issue #719
*/
public void interactiveRemovalTest() {
final JXTaskPaneContainer container = new JXTaskPaneContainer();
final JXTaskPane pane1 = new JXTaskPane();
pane1.setTitle("First");
container.add(pane1);
final JXTaskPane pane2 = new JXTaskPane();
pane2.setTitle("Second");
container.add(pane2);
JXFrame frame = wrapInFrame(container, "removal test");
frame.add(new JButton(new AbstractAction("Remove Second") {
public void actionPerformed(ActionEvent e) {
container.remove(pane2);
}
}), BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
/**
* Ensure correct painting when in JSplitPane.
* <p>
* SwingX issue #434
*/
public void interactiveSplitPaneTest() {
final JXTaskPaneContainer container = new JXTaskPaneContainer();
final JXTaskPane pane1 = new JXTaskPane();
pane1.setTitle("First");
pane1.add(new JLabel("1"));
pane1.add(new JLabel("2"));
pane1.add(new JLabel("3"));
container.add(pane1);
final JXTaskPane pane2 = new JXTaskPane();
class DummyAction extends AbstractAction {
DummyAction(String name, boolean enabled) {
super(name);
setEnabled(enabled);
}
/**
* {@inheritDoc}
*/
public void actionPerformed(ActionEvent e) {
//does nothing
}
}
pane2.setTitle("Second");
pane2.add(new DummyAction("MMMM", true));
pane2.add(new DummyAction("MMMM", false));
pane2.add(new DummyAction("<html>MMMM</html>", false));
pane2.add(new DummyAction("<html>MMMM</html>", true));
container.add(pane2);
final JXTaskPane pane3 = new JXTaskPane();
pane3.setTitle("Third");
pane3.add(new JLabel("1"));
pane3.add(new JLabel("2"));
pane3.add(new JLabel("3"));
container.add(pane3);
JSplitPane splitter = new JSplitPane();
splitter.setLeftComponent(container);
splitter.setContinuousLayout(true);
JXFrame frame = wrapInFrame(splitter, "split pane test");
addComponentOrientationToggle(frame);
frame.pack();
frame.setVisible(true);
}
@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);
}
/**
* Do nothing, make the test runner happy
* (would output a warning without a test fixture).
*
*/
public void testDummy() {
}
public abstract class AbstractLBContentPanel<T extends Object>
extends JPanel {
private JXTaskPaneContainer taskPane;
private JXTaskPaneContainer jxTaskPaneContainer;
public AbstractLBContentPanel(T content) {
taskPane = getJXTaskPaneContainer(content);
this.add(taskPane);
}
/**
* This method initializes JXTaskPaneContainer
*
* @return org.jdesktop.swingx.JXTaskPaneContainer
*/
private JXTaskPaneContainer getJXTaskPaneContainer(T content) {
if (jxTaskPaneContainer == null) {
try {
JXTaskPane first = new JXTaskPane();
fillTaskPane(first);
JXTaskPane second = new JXTaskPane();
fillTaskPane(second);
jxTaskPaneContainer = new JXTaskPaneContainer();
jxTaskPaneContainer.setSize(new Dimension(200, 220)); // Generated
jxTaskPaneContainer.setOpaque(false);
jxTaskPaneContainer.add(first);
jxTaskPaneContainer.add(second);
} catch (java.lang.Throwable e) {
e.printStackTrace();
}
}
return jxTaskPaneContainer;
}
}
}