/*
* $Id$
*
* 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.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import org.jdesktop.swingx.JXHeader.IconPosition;
import org.jdesktop.swingx.test.XTestUtils;
/**
* Tests previously created to expose known issues of <code>JXHeader</code>, now fixed.
* Still need visual inspection from time to time.
* <p>
*
* @author Jeanette Winzenburg
*/
public class JXHeaderVisualCheck extends InteractiveTestCase {
@SuppressWarnings("unused")
private static final Logger LOG = Logger
.getLogger(JXHeaderVisualCheck.class.getName());
public static void main(String args[]) {
JXHeaderVisualCheck test = new JXHeaderVisualCheck();
try {
test.runInteractiveTests();
// test.runInteractiveTests("interactiveHTMLTextWrapLong");
// test.runInteractiveTests("interactive.*Label.*");
// test.runInteractiveTests("interactive.*Font.*");
} catch (Exception e) {
System.err.println("exception when executing interactive tests:");
e.printStackTrace();
}
}
@Override
protected void setUp() throws Exception {
setSystemLF(true);
}
// ------------------ interactive
public void interactiveHeaderInTabbedPane() {
// Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
//
// public void eventDispatched(AWTEvent event) {
// System.out.println("e:" + event);
// }}, Long.MAX_VALUE);
JTabbedPane pane = new JTabbedPane();
pane.addTab("first", createHeader());
pane.addTab("second", createHeader());
JXFrame frame = wrapInFrame(pane, "NPE: header in tabbedPane?");
addComponentOrientationToggle(frame);
show(frame);
}
private JXHeader createHeader() {
JXHeader header = new JXHeader();
header.setTitle("AlbumManager");
String headerLong = "An adaption from JGoodies Binding Tutorial in the context"
+ " of BeansBinding/AppFramework. "
+ "The Tabs show different styles of typical interaction "
+ "setups (in-place editing vs. dialog-editing). ";
header.setDescription(headerLong);
header.setIcon(XTestUtils.loadDefaultIcon());
return header;
}
/**
* #647-swingx JXLabel looses html rendering on font change.
*/
public void interactiveFontLayoutReset() {
JFrame f = new JFrame("Header Test - html lost on font change");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JXHeader header = new JXHeader("My Title",
"<html>My short description<br>some text<html>");
f.add(header, BorderLayout.CENTER);
JButton changeFont = new JButton("Font");
f.add(changeFont, BorderLayout.SOUTH);
changeFont.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
header.setFont(new Font("Tahoma", Font.PLAIN, 18));
}
});
}
});
f.setSize(400, 200);
f.setVisible(true);
}
/**
* Short description in header produces unexpected line wraps in
* footer.
*
* Note: the frame is not packed to simulate the appframework
* context.
*/
public void interactiveHTMLTextWrapShort() {
JXHeader header = new JXHeader();
header.setTitle("AlbumManager");
String headerShort = "An adaption from JGoodies Binding Tutorial in the context"
+ " of BeansBinding/AppFramework. ";
header.setDescription(headerShort);
header.setIcon(XTestUtils.loadDefaultIcon());
JXHeader footer = new JXHeader();
footer.setTitle("Notes:");
String footerDescription = "<html>"
+ " <ul> "
+ " <li> code: in the jdnc-incubator, section kleopatra, package appframework."
+ " <li> technique: back the view by a shared presentation model "
+ " <li> technique: veto selection change until editing is completed "
+ " <li> issue: selection of tab should be vetoable "
+ " <li> issue: empty selection should disable editing pane "
+ " </ul> " + " </html>";
footer.setDescription(footerDescription);
JComponent panel = new JPanel(new BorderLayout());
panel.add(header, BorderLayout.NORTH);
panel.add(footer, BorderLayout.SOUTH);
JXFrame frame = new JXFrame("html wrapping in SOUTh: short text in NORTH");
frame.add(panel);
frame.setSize(800, 400);
frame.setVisible(true);
}
/**
* Long description in header produces expected line-wrap in footer.
*
* Note: the frame is not packed to simulate the appframework
* context.
*/
public void interactiveHTMLTextWrapLong() {
// Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
//
// public void eventDispatched(AWTEvent event) {
// if (event.getID() != MouseEvent.MOUSE_MOVED) {
// System.out.println("e:" + event);
// }
// }}, Long.MAX_VALUE);
JXHeader header = createHeader();
JXHeader footer = new JXHeader();
footer.setTitle("Notes:");
String footerDescription = "<html>"
+ " <ul> "
+ " <li> code: in the jdnc-incubator, section kleopatra, package appframework."
+ " <li> technique: back the view by a shared presentation model "
+ " <li> technique: veto selection change until editing is completed "
+ " <li> issue: selection of tab should be vetoable "
+ " <li> issue: empty selection should disable editing pane "
+ " </ul> " + " </html>";
footer.setDescription(footerDescription);
JComponent panel = new JPanel(new BorderLayout());
panel.add(header, BorderLayout.NORTH);
// panel.add(new JScrollPane(table));
panel.add(footer, BorderLayout.SOUTH);
// JXFrame frame = new JXFrame("html wrapping in SOUTH: long text in NORTH");
// frame.add(panel);
JXFrame frame = wrapInFrame(panel, "html wrapping in SOUTH: long text in NORTH");
// addComponentOrientationToggle(frame);
frame.setSize(800, 600);
// show(frame);
frame.setVisible(true);
}
/**
* Issue #403-swingx: JXHeader doesn't show custom values.
* <p>
*
* All values are passed in the constructor.
*/
public void interactiveCustomProperties() {
Icon icon = XTestUtils.loadDefaultIcon();
assertNotNull("sanity: default icon loaded", icon);
JPanel p = new JPanel(new BorderLayout());
JXHeader header = new JXHeader("MyTitle", "MyDescription", icon);
header.setIconPosition(IconPosition.LEFT);
JPanel px = new JPanel(new GridLayout(2,1));
px.add(header);
px.add(new JXHeader("MyTitle", "MyDescription", icon));
p.add(px);
// added just to better visualize bkg gradient in the JXHeader.
p.add(new JLabel("Reference component: JLabel"), BorderLayout.SOUTH);
p.add(new JXLabel("Reference component: JXLabel"), BorderLayout.NORTH);
showInFrame(p, "JXHeader with custom properties");
}
/**
* Issue #469-swingx: JXHeader doesn't wrap words in description.<p>
* Issue #634-swingx: JXHeader uses incorrect font for description.<p>
*
* All values are passed in the constructor.
*/
public void interactiveWordWrapping() {
Icon icon = XTestUtils.loadDefaultIcon();
assertNotNull("sanity: default icon loaded", icon);
JPanel p = new JPanel(new BorderLayout());
JXHeader header = new JXHeader("MyTitle", "this is a long test with veeeeeeeeeeeeeery looooooong wooooooooooooords", icon);
p.add(header);
p.setPreferredSize(new Dimension(200,150));
showInFrame(p, "word wrapping JXHeader");
}
/**
* Test custom title font and color use.
*
* All values are passed in the constructor.
*/
public void interactiveCustomTitleFont() {
Icon icon = XTestUtils.loadDefaultIcon();
assertNotNull("sanity: default icon loaded", icon);
JPanel p = new JPanel(new BorderLayout());
final JXHeader header = new JXHeader("MyBigUglyTitle", "this is a long test with veeeeeeeeeeeeeery looooooong wooooooooooooords", icon);
header.setTitleFont(new Font("serif", Font.BOLD, 36));
header.setTitleForeground(Color.GREEN);
p.add(header);
p.setPreferredSize(new Dimension(400,150));
JXFrame frame = wrapInFrame(p, "Titlefont lost on updateUI / word wrapping JXHeader");
Action action = new AbstractAction("updateUI") {
public void actionPerformed(ActionEvent e) {
header.updateUI();
}};
addAction(frame, action);
Action tree = new AbstractAction("updateComponentTree") {
public void actionPerformed(ActionEvent e) {
SwingUtilities.updateComponentTreeUI(header);
}};
addAction(frame, tree);
addMessage(frame, "title font set on header");
show(frame);
}
/**
* Empty test method to keep the testrunner happy.
*/
public void testDummy() {
}
}