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&oslash;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&oslash;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&oslash;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&oslash;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&oslash;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&oslash;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&oslash;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&oslash;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

Reply via email to