/*
* $Id$
*
* Copyright 2008 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.ComponentOrientation;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import org.jdesktop.swingx.JXCollapsiblePane.Direction;
import org.jdesktop.swingx.action.AbstractActionExt;
/**
* @author Karl George Schaefer
*
*/
public class JXCollapsiblePaneVisualCheck extends InteractiveTestCase {
/**
* @param args
*/
public static void main(String[] args) {
JXCollapsiblePaneVisualCheck test = new JXCollapsiblePaneVisualCheck();
try {
test.runInteractiveTests();
// test.runInteractiveTests("interactiveBidiDirectionTest");
} catch (Exception e) {
System.err.println("exception when executing interactive tests:");
e.printStackTrace();
}
}
/**
* {@inheritDoc}
*/
@Override
protected void createAndAddMenus(JMenuBar bar, final JComponent component) {
super.createAndAddMenus(bar, component);
JMenu menu = new JMenu("Tools");
menu.add(new AbstractAction("Toggle Orientation") {
@Override
public void actionPerformed(ActionEvent e) {
if (component.getParent().getComponentOrientation().isLeftToRight()) {
component.getParent().applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
} else {
component.getParent().applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
}
if (component.getParent() instanceof JComponent) {
((JComponent) component.getParent()).revalidate();
} else {
component.getParent().invalidate();
}
}
});
bar.add(menu);
}
/**
* Issue #1185-swingx: inconsistent change notification of "animatedState"
*
* Depends on value of animated: fired only if true, nothing happens on false
*
*
* Trying to resize a top-level window on collapsed state changes of a taskpane.
* Need to listen to "animationState" which is fired when animation is complete.
*/
public void interactiveDialogWithCollapsibleFalse() {
JXTaskPane pane = new JXTaskPane();
pane.setAnimated(false);
pane.setTitle("Just a TaskPane with animated property false");
final JXDialog dialog = new JXDialog(pane);
PropertyChangeListener l = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("collapsed".equals(evt.getPropertyName())) {
dialog.pack();
}
}
};
pane.addPropertyChangeListener(l);
pane.add(new JLabel("to have some content"));
dialog.setTitle("pack on expand/collapse");
dialog.pack();
dialog.setVisible(true);
}
/**
* Trying to resize a top-level window on collapsed state changes of a taskpane.
* Need to listen to "animationState" which is fired when animation is complete.
*
* Note: works only if animated is true (see Issue #1185-swingx)
*/
public void interactiveDialogWithCollapsibleTrue() {
JXTaskPane pane = new JXTaskPane();
pane.setTitle("Just a TaskPane with animated property true");
final JXDialog dialog = new JXDialog(pane);
PropertyChangeListener l = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("collapsed".equals(evt.getPropertyName())) {
dialog.pack();
}
}
};
pane.addPropertyChangeListener(l);
pane.add(new JLabel("to have some content"));
dialog.setTitle("pack on expand/collapse");
dialog.pack();
dialog.setVisible(true);
}
/**
* SwingX 578: Ensure that the directions work correctly.
*/
public void interactiveDirectionTest() {
JXCollapsiblePane north = new JXCollapsiblePane(Direction.UP);
JLabel label = new JLabel("<html>north1<br>north2<br>north3<br>north4<br>north5<br>north6</html>");
label.setHorizontalAlignment(SwingConstants.CENTER);
north.add(label);
JXCollapsiblePane south = new JXCollapsiblePane(Direction.DOWN);
label = new JLabel("<html>south1<br>south2<br>south3<br>south4<br>south5<br>south6</html>");
label.setHorizontalAlignment(SwingConstants.CENTER);
south.add(label);
JXCollapsiblePane west = new JXCollapsiblePane(Direction.LEFT);
west.add(new JLabel("west1west2west3west4west5west6"));
JXCollapsiblePane east = new JXCollapsiblePane(Direction.RIGHT);
east.add(new JLabel("east1east2east3east4east5east6"));
JPanel panel = new JPanel(new GridLayout(2, 2));
JButton button = new JButton(north.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION));
button.setText("UP");
panel.add(button);
button = new JButton(south.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION));
button.setText("DOWN");
panel.add(button);
button = new JButton(west.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION));
button.setText("LEFT");
panel.add(button);
button = new JButton(east.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION));
button.setText("RIGHT");
panel.add(button);
JFrame frame = wrapInFrame(panel, "Direction Animation Test");
frame.add(north, BorderLayout.NORTH);
frame.add(south, BorderLayout.SOUTH);
frame.add(west, BorderLayout.WEST);
frame.add(east, BorderLayout.EAST);
frame.pack();
frame.setVisible(true);
}
/**
* SwingX 839: Ensure that the directions work correctly.
*/
public void interactiveBidiDirectionTest() {
JXCollapsiblePane start = new JXCollapsiblePane(Direction.START);
JLabel label = new JLabel("<html>start1<br>start2<br>start3<br>start4<br>start5<br>start6</html>");
label.setHorizontalAlignment(SwingConstants.CENTER);
start.add(label);
JXCollapsiblePane end = new JXCollapsiblePane(Direction.END);
label = new JLabel("<html>end1<br>end2<br>end3<br>end4<br>end5<br>end6</html>");
label.setHorizontalAlignment(SwingConstants.CENTER);
end.add(label);
JXCollapsiblePane leading = new JXCollapsiblePane(Direction.LEADING);
leading.add(new JLabel("leading1leading2leading3leading4leading5leading6"));
JXCollapsiblePane trailing = new JXCollapsiblePane(Direction.TRAILING);
trailing.add(new JLabel("traling1trailing2trailing3trailing4trailing5trailing6"));
JPanel panel = new JPanel(new GridLayout(2, 2));
JButton button = new JButton(start.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION));
button.setText("START");
panel.add(button);
button = new JButton(end.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION));
button.setText("END");
panel.add(button);
button = new JButton(leading.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION));
button.setText("LEADING");
panel.add(button);
button = new JButton(trailing.getActionMap().get(JXCollapsiblePane.TOGGLE_ACTION));
button.setText("TRAILING");
panel.add(button);
JFrame frame = wrapInFrame(panel, "Direction Animation Test");
frame.add(start, BorderLayout.PAGE_START);
frame.add(end, BorderLayout.PAGE_END);
frame.add(leading, BorderLayout.LINE_START);
frame.add(trailing, BorderLayout.LINE_END);
frame.pack();
frame.setVisible(true);
}
/**
* Test case for bug 1076.
*/
public void interactiveAnimationSizingTest() {
JPanel panel = new JPanel(new BorderLayout());
final JXCollapsiblePane collPane = new JXCollapsiblePane();
collPane.setCollapsed(true);
collPane.add(new JLabel("hello!"));
collPane.setAnimated(false); // critical statement
panel.add(collPane, BorderLayout.NORTH);
JButton button = new JButton("Toggle");
button.addActionListener(collPane.getActionMap().get(
JXCollapsiblePane.TOGGLE_ACTION));
panel.add(button, BorderLayout.CENTER);
showInFrame(panel, "Animation Sizing Test");
}
/**
* Test case for bug 1087. Hidden components should not have focus.
*/
public void interactiveFocusTest() {
JPanel panel = new JPanel(new BorderLayout());
final JXCollapsiblePane instance = new JXCollapsiblePane();
panel.add(instance, BorderLayout.SOUTH);
JButton paneButton = new JButton("I do nothing");
paneButton.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
if (instance.isCollapsed()) {
fail("Why am i getting focus?!");
}
}
});
instance.add(paneButton);
JButton button = new JButton("Toggle");
button.addActionListener(instance.getActionMap().get(
JXCollapsiblePane.TOGGLE_ACTION));
panel.add(button, BorderLayout.CENTER);
showInFrame(panel, "Focus Test");
}
/**
* Test case for bug 1181. scrollXXXToVisible does not work.
*/
public void interactiveScrollToVisibleTest() {
JPanel panel = new JPanel(new BorderLayout());
JXCollapsiblePane pane = new JXCollapsiblePane();
pane.setScrollableTracksViewportHeight(false);
panel.add(new JScrollPane(pane), BorderLayout.SOUTH);
final JXTree tree = new JXTree();
pane.add(tree);
JXFindBar find = new JXFindBar(tree.getSearchable());
panel.add(find, BorderLayout.CENTER);
showInFrame(panel, "Scroll Rect To Visible Test");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
tree.expandAll();
}
});
}
/**
* Issue #1181-swingx: scrollRectToVisible not effective if component in JXTaskPane.
* Yet another one for the same issue - moved from TaskPaneIssues.
*
* example adapted from tjwolf,
* http://forums.java.net/jive/thread.jspa?threadID=66759&tstart=0
*/
public void interactiveScrollRectToVisible() {
final JXTree tree = new JXTree();
tree.expandAll();
JXTaskPane pane = new JXTaskPane();
pane.add(tree);
JComponent component = new JPanel(new BorderLayout());
component.add(pane);
JXFrame frame = wrapWithScrollingInFrame(component, "scroll to last row must work");
Action action = new AbstractActionExt("scrollToLastRow") {
@Override
public void actionPerformed(ActionEvent e) {
tree.scrollRowToVisible(tree.getRowCount()- 1);
}
};
addAction(frame, action);
// small dimension, make sure there is something to scroll
show(frame, 300, 200);
}
/**
* Test case for bug 433. When the initial size is 0 expansion fails.
*/
public void interactiveZeroInitialHeightTest() {
JPanel panel = new JPanel(new BorderLayout());
final JXCollapsiblePane collPane = new JXCollapsiblePane();
// collPane.setAnimated(false);
collPane.setCollapsed(true);
collPane.setCollapsed(false);
collPane.add(new JLabel("hello!"));
panel.add(collPane, BorderLayout.NORTH);
JButton button = new JButton("Toggle");
button.addActionListener(collPane.getActionMap().get(
JXCollapsiblePane.TOGGLE_ACTION));
panel.add(button, BorderLayout.CENTER);
showInFrame(panel, "Initial Sizing Test");
}
/**
* do nothing test - keep the testrunner happy.
*/
public void testDummy() {
}
}