/******************************************************************************* | |
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved. | |
* This program and the accompanying materials are made available under the | |
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 | |
* which accompanies this distribution. | |
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html | |
* and the Eclipse Distribution License is available at | |
* http://www.eclipse.org/org/documents/edl-v10.php. | |
* | |
* Contributors: | |
* Oracle - initial API and implementation from Oracle TopLink | |
******************************************************************************/ | |
package org.eclipse.persistence.tools.workbench.test.uitools; | |
import java.awt.BorderLayout; | |
import java.awt.Font; | |
import java.awt.GridLayout; | |
import java.awt.event.ActionEvent; | |
import java.awt.event.WindowAdapter; | |
import java.awt.event.WindowEvent; | |
import java.awt.event.WindowListener; | |
import java.util.Iterator; | |
import javax.swing.AbstractAction; | |
import javax.swing.Action; | |
import javax.swing.Icon; | |
import javax.swing.JButton; | |
import javax.swing.JFrame; | |
import javax.swing.JPanel; | |
import javax.swing.ListCellRenderer; | |
import javax.swing.UIManager; | |
import javax.swing.WindowConstants; | |
import org.eclipse.persistence.tools.workbench.uitools.FilteringListPanel; | |
import org.eclipse.persistence.tools.workbench.uitools.cell.SimpleListCellRenderer; | |
import org.eclipse.persistence.tools.workbench.utility.ClassTools; | |
import org.eclipse.persistence.tools.workbench.utility.Classpath; | |
import org.eclipse.persistence.tools.workbench.utility.CollectionTools; | |
import org.eclipse.persistence.tools.workbench.utility.iterators.TransformationIterator; | |
import org.eclipse.persistence.tools.workbench.utility.string.StringConverter; | |
/** | |
* Simple test class for playing around with the FilteringListPanel. | |
* | |
* Optional command line parm: | |
* the name of a jar (or class folder) to use to populate the list box | |
*/ | |
public class FilteringListPanelUITest { | |
private Object[] completeList1; | |
private Object[] completeList2; | |
private FilteringListPanel filteringListPanel; | |
private Font font; | |
public static void main(String[] args) { | |
new FilteringListPanelUITest().exec(args); | |
} | |
private FilteringListPanelUITest() { | |
super(); | |
this.initialize(); | |
} | |
private void initialize() { | |
this.font = this.buildFont(); | |
} | |
private Font buildFont() { | |
return new Font("Dialog", Font.PLAIN, 12); | |
} | |
private void exec(String[] args) { | |
this.completeList1 = this.buildTypeList(args); | |
this.completeList2 = this.buildCompleteList2(); | |
JFrame frame = new JFrame(ClassTools.shortClassNameForObject(this)); | |
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); | |
frame.addWindowListener(this.buildWindowListener()); | |
frame.getContentPane().add(this.buildMainPanel(), "Center"); | |
frame.setLocation(300, 300); | |
frame.setSize(400, 400); | |
frame.setVisible(true); | |
} | |
private Object[] buildTypeList(String[] args) { | |
return CollectionTools.sort(CollectionTools.array(this.buildTypes(args))); | |
} | |
private Object[] buildCompleteList2() { | |
String classpathEntry = Classpath.locationFor(this.getClass()); | |
return CollectionTools.sort(CollectionTools.array(this.buildTypes(new String[] {classpathEntry}))); | |
} | |
private Iterator buildTypes(String[] args) { | |
return new TransformationIterator(this.buildClassNames(args)) { | |
protected Object transform(Object next) { | |
return new Type((String) next); | |
} | |
}; | |
} | |
private Iterator buildClassNames(String[] args) { | |
if ((args == null) || (args.length == 0)) { | |
return Classpath.bootClasspath().classNamesStream(); | |
} | |
return new Classpath(new String[] {args[0]}).classNamesStream(); | |
} | |
private WindowListener buildWindowListener() { | |
return new WindowAdapter() { | |
public void windowClosing(WindowEvent e) { | |
e.getWindow().setVisible(false); | |
System.exit(0); | |
} | |
}; | |
} | |
private JPanel buildMainPanel() { | |
JPanel panel = new JPanel(new BorderLayout()); | |
this.filteringListPanel = this.buildFilteringListPanel(); | |
panel.add(this.filteringListPanel, BorderLayout.CENTER); | |
panel.add(this.buildControlPanel(), BorderLayout.SOUTH); | |
return panel; | |
} | |
private FilteringListPanel buildFilteringListPanel() { | |
Object initialSelection = this.typeNamedIn("java.lang.Object", this.completeList1); | |
FilteringListPanel panel = new FilteringListPanel(this.completeList1, initialSelection, this.buildStringConverter()); | |
panel.setTextFieldLabelText("Choose a Type (? = any char, * = any string):"); | |
panel.setListBoxLabelText("Matching Types:"); | |
panel.setComponentsFont(this.font); | |
panel.setListBoxCellRenderer(this.buildRenderer()); | |
return panel; | |
} | |
private StringConverter buildStringConverter() { | |
return new StringConverter() { | |
public String convertToString(Object o) { | |
return (o == null) ? "" : ((Type) o).getName(); | |
} | |
}; | |
} | |
private ListCellRenderer buildRenderer() { | |
return new SimpleListCellRenderer() { | |
protected Icon buildIcon(Object value) { | |
return UIManager.getIcon("Tree.leafIcon"); | |
} | |
protected String buildText(Object value) { | |
return ((Type) value).getName(); | |
} | |
}; | |
} | |
private JPanel buildControlPanel() { | |
JPanel panel = new JPanel(new GridLayout(1, 0)); | |
panel.add(this.buildSwapButton()); | |
panel.add(this.buildStringButton()); | |
panel.add(this.buildNullButton()); | |
panel.add(this.buildMax10Button()); | |
panel.add(this.buildPrintButton()); | |
return panel; | |
} | |
// ********** swap button ********** | |
private JButton buildSwapButton() { | |
JButton button = new JButton(this.buildSwapAction()); | |
button.setFont(this.font); | |
return button; | |
} | |
private Action buildSwapAction() { | |
return new AbstractAction("swap") { | |
public void actionPerformed(ActionEvent event) { | |
FilteringListPanelUITest.this.swap(); | |
} | |
}; | |
} | |
/** | |
* swap in a new list | |
*/ | |
void swap() { | |
if (this.filteringListPanel.getCompleteList() == this.completeList1) { | |
this.filteringListPanel.setCompleteList(this.completeList2); | |
} else { | |
this.filteringListPanel.setCompleteList(this.completeList1); | |
} | |
} | |
// ********** string button ********** | |
private JButton buildStringButton() { | |
JButton button = new JButton(this.buildStringAction()); | |
button.setFont(this.font); | |
return button; | |
} | |
private Action buildStringAction() { | |
return new AbstractAction("String") { | |
public void actionPerformed(ActionEvent event) { | |
FilteringListPanelUITest.this.selectStringType(); | |
} | |
}; | |
} | |
/** | |
* force a selection from "outside" the filtering list panel | |
*/ | |
void selectStringType() { | |
this.filteringListPanel.setSelection(this.typeNamed("java.lang.String")); | |
} | |
private Type typeNamed(String name) { | |
return this.typeNamedIn(name, this.filteringListPanel.getCompleteList()); | |
} | |
private Type typeNamedIn(String name, Object[] list) { | |
for (int i = list.length; i-- > 0; ) { | |
Type type = (Type) list[i]; | |
if (type.getName().equals(name)) { | |
return type; | |
} | |
} | |
return null; | |
} | |
// ********** null button ********** | |
private JButton buildNullButton() { | |
JButton button = new JButton(this.buildNullAction()); | |
button.setFont(this.font); | |
return button; | |
} | |
private Action buildNullAction() { | |
return new AbstractAction("null") { | |
public void actionPerformed(ActionEvent event) { | |
FilteringListPanelUITest.this.selectNull(); | |
} | |
}; | |
} | |
/** | |
* set the current selection to null | |
*/ | |
void selectNull() { | |
this.filteringListPanel.setSelection(null); | |
} | |
// ********** null button ********** | |
private JButton buildMax10Button() { | |
JButton button = new JButton(this.buildMax10Action()); | |
button.setFont(this.font); | |
return button; | |
} | |
private Action buildMax10Action() { | |
return new AbstractAction("max = 10") { | |
public void actionPerformed(ActionEvent event) { | |
FilteringListPanelUITest.this.setMax10(); | |
} | |
}; | |
} | |
/** | |
* toggle between allowing only 10 entries in the list box | |
* and no limit | |
*/ | |
void setMax10() { | |
if (this.filteringListPanel.getMaxListSize() == 10) { | |
this.filteringListPanel.setMaxListSize(-1); | |
} else { | |
this.filteringListPanel.setMaxListSize(10); | |
} | |
} | |
// ********** print button ********** | |
private JButton buildPrintButton() { | |
JButton button = new JButton(this.buildPrintAction()); | |
button.setFont(this.font); | |
return button; | |
} | |
private Action buildPrintAction() { | |
return new AbstractAction("print") { | |
public void actionPerformed(ActionEvent event) { | |
FilteringListPanelUITest.this.printType(); | |
} | |
}; | |
} | |
/** | |
* print the currently selected type to the console | |
*/ | |
void printType() { | |
System.out.println("selected item: " + this.filteringListPanel.getSelection()); | |
} | |
// ********** inner class ********** | |
private class Type implements Comparable { | |
private String name; | |
Type(String name) { | |
super(); | |
this.name = name; | |
} | |
public String shortName() { | |
return ClassTools.shortNameForClassNamed(this.name); | |
} | |
public String getName() { | |
return this.name; | |
} | |
public String toString() { | |
return "Type: " + this.name ; | |
} | |
public int compareTo(Object o) { | |
return this.name.compareTo(((Type) o).name); | |
} | |
} | |
} |