Update of /cvsroot/xdoclet/xdoclet2/src/java/xdoclet/gui/swing
In directory sc8-pr-cvs1:/tmp/cvs-serv16534/src/java/xdoclet/gui/swing
Added Files:
BeanContextConfigurationPanel.java BeanTreeCellRenderer.java
MethodAction.java MethodPanel.java MethodSheet.java
PropertySheet.java PropertyText.java
SwingValueHolderFactory.java package.html
Log Message:
Configuratoin GUI in Swing that provides the same functionality as Ant
--- NEW FILE: BeanContextConfigurationPanel.java ---
package xdoclet.gui.swing;
import xdoclet.BeanContextSupportEx;
import xdoclet.gui.BeanContextTreeModel;
import javax.swing.*;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeSelectionEvent;
import java.awt.*;
import java.util.Map;
import java.util.HashMap;
/**
* Configuration panel for XDoclet. This panel allows the same kind of
* configuration that is possible to do in a classical Ant script.
*
* @author <a href="mailto:aslak.hellesoy at bekk.no">Aslak Hellesøy</a>
* @version $Revision: 1.1 $
*/
public class BeanContextConfigurationPanel extends JPanel {
private final BeanContextSupportEx _xdocletContainer;
private final CardLayout _cards = new CardLayout();
private final JPanel _propertySheets = new JPanel(_cards);
private final Map _propertySheetMap = new HashMap();
/**
*
* @param xdocletContainer
*/
public BeanContextConfigurationPanel(BeanContextSupportEx xdocletContainer) {
_xdocletContainer = xdocletContainer;
setLayout(new GridLayout( 1, 0 ));
BeanContextTreeModel treeModel = new BeanContextTreeModel(_xdocletContainer);
JTree tree = new JTree(treeModel);
// Add a renderer that renders nodes nicely.
tree.setCellRenderer(new BeanTreeCellRenderer());
// Add a listener that listens for tree selections.
tree.addTreeSelectionListener(new TreeSelectionListener() {
/**
* When a node (bean) is selected we want to display editors for
* all properties. We're using BeanInfo to figure out what editors
* to display.
*
* @param e
*/
public void valueChanged(TreeSelectionEvent e) {
Object bean = e.getPath().getLastPathComponent();
// Get the property sheet for that bean
PropertySheet propertySheet = getPropertySheet(bean);
showPropertySheet(propertySheet);
}
});
JScrollPane scroll = new JScrollPane(tree);
add(scroll);
add(_propertySheets);
}
/**
* Callback method from PropertySheetCommander. Called when a TreeNode
* is selected and no PropertySheet has yet been added for this node.
*
* @param propertySheet
*/
private void addPropertySheet( PropertySheet propertySheet ) {
// JOptionPane.showMessageDialog(null, "Adding propertySheet: " +
propertySheet.getName() );
_propertySheets.add( propertySheet.getName(), propertySheet );
}
private void showPropertySheet( PropertySheet propertySheet ) {
// JOptionPane.showMessageDialog(null, "Showing propertySheet: " +
propertySheet.getName() );
_cards.show( _propertySheets, propertySheet.getName() );
}
/**
* Gets a PropertySheet for a Bean, and lazily creates it if it doesn't
* exist.
* @param bean
* @return
*/
private PropertySheet getPropertySheet(Object bean) {
PropertySheet propertySheet = (PropertySheet) _propertySheetMap.get(bean);
if( propertySheet == null ) {
propertySheet = new PropertySheet( bean );
_propertySheetMap.put( bean, propertySheet );
addPropertySheet(propertySheet);
}
return propertySheet;
}
}
--- NEW FILE: BeanTreeCellRenderer.java ---
package xdoclet.gui.swing;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.*;
import java.awt.*;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.IntrospectionException;
/**
* Renders a tree cell using information from a bean's BeanInfo.
*
* @author <a href="mailto:aslak.hellesoy at bekk.no">Aslak Hellesøy</a>
* @version $Revision: 1.1 $
*/
class BeanTreeCellRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus
) {
// Let the superclass do the dirty work.
JLabel result = (JLabel) super.getTreeCellRendererComponent(
tree,
value,
sel,
expanded,
leaf,
row,
hasFocus
);
try {
BeanInfo beanInfo = Introspector.getBeanInfo(value.getClass());
// JOptionPane.showMessageDialog(null,"BeanTreeCellRenderer Got BeanInfo
for " + value.getClass() + ":" + beanInfo.getClass().getName());
Image image = beanInfo.getIcon(BeanInfo.ICON_COLOR_16x16);
if( image != null ) {
result.setIcon(new ImageIcon(image));
}
result.setText(beanInfo.getBeanDescriptor().getName());
} catch (IntrospectionException e) {
e.printStackTrace(); //To change body of catch statement use Options |
File Templates.
}
return result;
}
}
--- NEW FILE: MethodAction.java ---
package xdoclet.gui.swing;
import xdoclet.gui.ValueHolder;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.beans.MethodDescriptor;
/**
*
* @author <a href="mailto:aslak.hellesoy at bekk.no">Aslak Hellesøy</a>
* @version $Revision: 1.1 $
*/
class MethodAction extends AbstractAction {
private final Object _bean;
private final MethodDescriptor _methodDescriptor;
private final ValueHolder[] _valueHolders;
public MethodAction( Object bean, MethodDescriptor methodDescriptor, ValueHolder[]
valueHolders ) {
_bean = bean;
_methodDescriptor = methodDescriptor;
_valueHolders = valueHolders;
putValue(Action.NAME, _methodDescriptor.getName());
//putValue(Action.SMALL_ICON, _methodDescriptor.xxx());
}
public void actionPerformed(ActionEvent evt) {
try {
_methodDescriptor.getMethod().invoke(_bean, getArguments());
} catch( Exception e ) {
JOptionPane.showMessageDialog(null, e.getStackTrace(), e.getMessage(),
JOptionPane.ERROR_MESSAGE );
}
}
private Object[] getArguments() {
if( _valueHolders != null ) {
Object[] arguments = new Object[_valueHolders.length];
for( int i = 0; i < arguments.length; i++ ) {
arguments[ i ] = _valueHolders[ i ].getValue();
}
return arguments;
} else {
return null;
}
}
}
--- NEW FILE: MethodPanel.java ---
package xdoclet.gui.swing;
import xdoclet.gui.swing.MethodAction;
import xdoclet.gui.ValueHolder;
import javax.swing.*;
import java.beans.MethodDescriptor;
import java.beans.ParameterDescriptor;
import java.lang.reflect.Method;
import java.awt.*;
/**
*
* @author <a href="mailto:aslak.hellesoy at bekk.no">Aslak Hellesøy</a>
* @version $Revision: 1.1 $
*/
class MethodPanel extends JPanel {
public MethodPanel(Object bean, MethodDescriptor methodDescriptor) {
setLayout(new GridLayout(0,1));
Method method = methodDescriptor.getMethod();
Class[] parameterTypes = method.getParameterTypes();
ParameterDescriptor[] parameterDescriptors =
methodDescriptor.getParameterDescriptors();
ValueHolder[] valueHolders = null;
if (parameterTypes != null) {
valueHolders = new ValueHolder[parameterTypes.length];
for (int p = 0; p < parameterTypes.length; p++) {
valueHolders[p] =
SwingValueHolderFactory.createValueHolder(parameterTypes[p], null);
add( (Component) valueHolders[p] );
}
}
MethodAction methodAction = new MethodAction(bean, methodDescriptor,
valueHolders);
methodAction.putValue(Action.NAME, methodDescriptor.getDisplayName());
JButton methodButton = new JButton(methodAction);
add(methodButton);
}
}
--- NEW FILE: MethodSheet.java ---
package xdoclet.gui.swing;
import xdoclet.gui.swing.MethodPanel;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.awt.CardLayout;
import java.awt.BorderLayout;
import javax.swing.*;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.IntrospectionException;
import java.beans.MethodDescriptor;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
/**
* A panel with [EMAIL PROTECTED] java.awt.CardLayout} stacking multiple [EMAIL
PROTECTED] MethodPanel}
* panels and showing only one of them (depending on what method is
* selected in the combo box).
* <pre>
* +-----------------------------+
* | Combo |
* +-----------------------------+
* | |
* | |
* | Cards |
* | of |
* | MethodPanel |
* | |
* | |
* +-----------------------------+
* </pre>
*
* @author <a href="mailto:aslak.hellesoy at bekk.no">Aslak Hellesøy</a>
* @version $Revision: 1.1 $
*/
class MethodSheet extends JPanel {
private CardLayout _cards = new CardLayout();
private JPanel _methodPanels = new JPanel(_cards);
public MethodSheet(Object bean) {
setLayout(new BorderLayout());
// Populate the sheet with components
BeanInfo beanInfo = null;
try {
beanInfo = Introspector.getBeanInfo(bean.getClass());
} catch (IntrospectionException e) {
e.printStackTrace();
throw new IllegalStateException("Couldn't get BeanInfo for " +
bean.getClass() + ":" + e.getMessage());
}
// JOptionPane.showMessageDialog(null,"PropertySheet Got BeanInfo for " +
bean.getClass() + ":" + beanInfo.getClass().getName());
// Set the name on this panel. Needed for CardLayout to work.
setName(beanInfo.getBeanDescriptor().getName());
// Display available methods in a combo
MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors();
// Make a card for each method as long as it isn't hidden.
// (It will be hidden if it doesn't have @bean.method tags)
List nonHiddenMethodDescriptors = new ArrayList();
for (int m = 0; m < methodDescriptors.length; m++) {
if( !methodDescriptors[m].isHidden() ) {
MethodPanel methodPanel = new MethodPanel(bean, methodDescriptors[m]);
_methodPanels.add( "" + m, methodPanel);
nonHiddenMethodDescriptors.add(methodDescriptors[m]);
}
}
final MethodComboModel model = new
MethodComboModel(nonHiddenMethodDescriptors);
JComboBox methodCombo = new JComboBox( model );
add( methodCombo, BorderLayout.NORTH );
add( _methodPanels, BorderLayout.CENTER );
// Add a selection listener to the combo so we can show the appropriate
// MethodPanel when it changes.
methodCombo.addItemListener( new ItemListener() {
public void itemStateChanged(ItemEvent evt) {
int itemIndex = model.getIndexOf(evt.getItem());
_cards.show( _methodPanels, "" + itemIndex );
}
});
}
private class MethodComboModel extends DefaultComboBoxModel {
public MethodComboModel( List methodDescriptors ) {
for( Iterator i = methodDescriptors.iterator(); i.hasNext(); ) {
MethodDescriptor md = (MethodDescriptor) i.next();
addElement( md.getDisplayName() );
}
}
}
}
--- NEW FILE: PropertySheet.java ---
package xdoclet.gui.swing;
import xdoclet.gui.swing.MethodAction;
import xdoclet.gui.swing.MethodSheet;
import javax.swing.*;
import java.awt.*;
import java.beans.*;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
/**
*
* @author <a href="mailto:aslak.hellesoy at bekk.no">Aslak Hellesøy</a>
* @version $Revision: 1.1 $
*/
class PropertySheet extends JPanel {
public PropertySheet(Object bean) {
setLayout(new GridLayout(0, 1));
JPanel props = new JPanel(new GridLayout(0,1));
// Populate the sheet with components
BeanInfo beanInfo = null;
try {
beanInfo = Introspector.getBeanInfo(bean.getClass());
} catch (IntrospectionException e) {
e.printStackTrace();
throw new IllegalStateException("Couldn't get BeanInfo for " +
bean.getClass() + ":" + e.getMessage());
}
// JOptionPane.showMessageDialog(null,"PropertySheet Got BeanInfo for " +
bean.getClass() + ":" + beanInfo.getClass().getName());
// Set the name on this panel. Needed for CardLayout to work.
setName(beanInfo.getBeanDescriptor().getName());
// Make property editors
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; i++) {
try {
Component editor = createEditorComponent(propertyDescriptors[i], bean);
// JOptionPane.showMessageDialog(null,"Adding editor for " +
propertyDescriptors[i].getPropertyType().getName() + " " +
propertyDescriptors[i].getName() + ":" + editor.getClass().getName());
props.add(new JLabel(propertyDescriptors[i].getName()));
props.add(editor);
} catch (IntrospectionException e) {
System.out.println(e.getMessage());
} catch (HeadlessException e) {
e.printStackTrace(); //To change body of catch statement use Options
| File Templates.
}
}
add(props);
add( new MethodSheet(bean));
}
private Component createEditorComponent(PropertyDescriptor propertyDescriptor,
Object bean) throws IntrospectionException {
// Instantiate a new editor.
PropertyEditor propertyEditor =
PropertyEditorManager.findEditor(propertyDescriptor.getPropertyType());
if (propertyEditor == null) {
throw new IntrospectionException("No property editor found for type " +
propertyDescriptor.getPropertyType().getName());
}
// Ask the bean for its current value.
Method getter = propertyDescriptor.getReadMethod();
if (getter != null) {
try {
Object value = getter.invoke(bean, null);
propertyEditor.setValue(value);
} catch (IllegalAccessException e) {
e.printStackTrace(); //To change body of catch statement use Options
| File Templates.
// JOptionPane.showMessageDialog(null,"IllegalAccessException: " +
e.getMessage());
throw new IntrospectionException(e.getMessage());
} catch (IllegalArgumentException e) {
e.printStackTrace(); //To change body of catch statement use Options
| File Templates.
// JOptionPane.showMessageDialog(null,"IllegalArgumentException: " +
e.getMessage());
throw new IntrospectionException(e.getMessage());
} catch (InvocationTargetException e) {
e.printStackTrace(); //To change body of catch statement use Options
| File Templates.
// JOptionPane.showMessageDialog(null,"InvocationTargetException: " +
e.getMessage());
throw new IntrospectionException(e.getMessage());
}
// Now figure out how to display it...
if (propertyEditor.isPaintable() && propertyEditor.supportsCustomEditor())
{
// editorComponent = new PropertyCanvas(frame, editor);
return propertyEditor.getCustomEditor();
} else if (propertyEditor.getTags() != null) {
// editorComponent = new PropertySelector(editor);
} else if (propertyEditor.getAsText() != null) {
return new PropertyText(propertyEditor);
}
}
throw new IntrospectionException("Property \"" + propertyDescriptor.getName()
+ "\" has non-displayabale editor.");
}
}
--- NEW FILE: PropertyText.java ---
package xdoclet.gui.swing;
import javax.swing.*;
import java.beans.PropertyEditor;
import java.awt.event.KeyEvent;
import java.awt.event.FocusEvent;
import java.awt.event.KeyListener;
import java.awt.event.FocusListener;
/**
* Support for a PropertyEditor that uses text.
* @author <a href="mailto:aslak.hellesoy at bekk.no">Aslak Hellesøy</a>
* @version $Revision: 1.1 $
*/
class PropertyText extends JTextField implements KeyListener, FocusListener {
private PropertyEditor _propertyEditor;
PropertyText(PropertyEditor propertyEditor) {
super();
_propertyEditor = propertyEditor;
//addKeyListener(this);
//addFocusListener(this);
setText(_propertyEditor.getAsText());
}
protected void updateEditor() {
try {
_propertyEditor.setAsText(getText());
} catch (IllegalArgumentException ex) {
// Quietly ignore.
}
}
//----------------------------------------------------------------------
// Focus listener methods.
public void focusGained(FocusEvent e) {
}
public void focusLost(FocusEvent e) {
updateEditor();
}
//----------------------------------------------------------------------
// Keyboard listener methods.
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
updateEditor();
}
}
public void keyPressed(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}
--- NEW FILE: SwingValueHolderFactory.java ---
package xdoclet.gui.swing;
import xdoclet.gui.ValueHolder;
import xdoclet.gui.ValueHolderFactory;
import javax.swing.*;
import java.beans.FeatureDescriptor;
/**
*
* @author <a href="mailto:aslak.hellesoy at bekk.no">Aslak Hellesøy</a>
* @version $Revision: 1.1 $
*/
class SwingValueHolderFactory implements ValueHolderFactory {
public static ValueHolder createValueHolder(Class parameterClass,
FeatureDescriptor featureDescriptor) {
return new StringValueHolder();
}
private static class StringValueHolder extends JTextField implements ValueHolder {
public Object getValue() {
return getText();
}
public void setValue(Object o) {
setText(o.toString());
}
}
}
--- NEW FILE: package.html ---
<body>
Configuration panel in Swing that can be used in IDE plugins.
</body>
-------------------------------------------------------
This SF.net email is sponsored by:Crypto Challenge is now open!
Get cracking and register here for some mind boggling fun and
the chance of winning an Apple iPod:
http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0031en
_______________________________________________
xdoclet-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/xdoclet-devel