[CVS nano] update

Paul Hammant <paul-yCVjj/[email protected]> Mon, 17 Nov 2003 15:03:22 -0600
Newsgroups gmane.comp.java.nanocontainer.cvs
Message-ID <[email protected]>
Commit in nano/picogui/src/java/org/picoextras/gui/swing on MAIN

AddPicoContainerAction.java +35 added 1.1

AddToContainerNodeAction.java +47 added 1.1

ComponentRegistrar.java +37 added 1.1

EditContainerPanel.java +25 added 1.1

ExecuteContainerAction.java +55 added 1.1

PicoGui.java +120 added 1.1

PicoTreeCellRenderer.java +56 added 1.1

PicoTreeModel.java +77 added 1.1

PropertyTableCommander.java +34 added 1.1

TreeExpander.java +48 added 1.1

+534

10 added files

update

----------

nano /picogui /src /java /org /picoextras /gui /swing

AddPicoContainerAction.java added at 1.1

diff -N AddPicoContainerAction.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ AddPicoContainerAction.java 17 Nov 2003 21:03:21 -0000 1.1
@@ -0,0 +1,35 @@

+package org.picoextras.gui.swing;
+
+import org.picoextras.gui.model.ContainerNode;
+
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeModel;
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.awt.*;
+
+/**
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class AddPicoContainerAction extends AddToContainerNodeAction {
+ private final TreeModel treeModel;
+
+ public AddPicoContainerAction(
+ Component errorDialogParent,
+ TreeModel treeModel,
+ JTree treeToListenTo) {
+ super("Add PicoContainer", errorDialogParent, treeToListenTo);
+ this.treeModel = treeModel;
+ }
+
+ protected void setEnabled() {
+ setEnabled(getSelectedContainerNode() != null);
+
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ ContainerNode containerNode = new ContainerNode();
+// treeModel.insertNodeInto(containerNode, getSelectedContainerNode(), 0);
+ }
+}

----------

nano /picogui /src /java /org /picoextras /gui /swing

AddToContainerNodeAction.java added at 1.1

diff -N AddToContainerNodeAction.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ AddToContainerNodeAction.java 17 Nov 2003 21:03:21 -0000 1.1
@@ -0,0 +1,47 @@

+package org.picoextras.gui.swing;
+
+import org.picoextras.gui.model.ContainerNode;
+
+import javax.swing.*;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.event.TreeSelectionEvent;
+import java.awt.*;
+
+/**
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public abstract class AddToContainerNodeAction extends AbstractAction implements TreeSelectionListener {
+ private final Component errorDialogParent;
+ private ContainerNode selectedContainerNode = null;
+
+ public AddToContainerNodeAction(
+ String name,
+ Component errorDialogParent,
+ JTree treeToListenTo) {
+ super(name);
+ this.errorDialogParent = errorDialogParent;
+ treeToListenTo.addTreeSelectionListener(this);
+ setEnabled();
+ }
+
+ public void valueChanged(TreeSelectionEvent evt) {
+ Object selected = evt.getPath().getLastPathComponent();
+ if(selected instanceof ContainerNode) {
+ selectedContainerNode = (ContainerNode) selected;
+ } else {
+ selectedContainerNode = null;
+ }
+ setEnabled();
+ }
+
+ protected ContainerNode getSelectedContainerNode() {
+ return selectedContainerNode;
+ }
+
+ protected void showErrorDialog(Exception e) {
+ JOptionPane.showMessageDialog(errorDialogParent,e.getStackTrace(),e.getClass().getName() + " " + e.getMessage(), JOptionPane.ERROR_MESSAGE);
+ }
+
+ protected abstract void setEnabled();
+}

----------

nano /picogui /src /java /org /picoextras /gui /swing

ComponentRegistrar.java added at 1.1

diff -N ComponentRegistrar.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ComponentRegistrar.java 17 Nov 2003 21:03:21 -0000 1.1
@@ -0,0 +1,37 @@

+package org.picoextras.gui.swing;
+
+import org.picoextras.gui.model.ContainerNode;
+import org.picoextras.gui.model.BeanPropertyModel;
+import org.picoextras.gui.model.ComponentNode;
+import org.picoextras.gui.model.BeanPropertyTableModel;
+
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreeModel;
+import javax.swing.*;
+import java.beans.IntrospectionException;
+
+public class ComponentRegistrar {
+ private final TreeModel treeModel;
+ private final JTable table;
+
+ public ComponentRegistrar(TreeModel treeModel, JTable table) {
+ this.treeModel = treeModel;
+ this.table = table;
+ }
+
+ public void createComponentNodeInTree(ContainerNode containerNode, Object componentKey, Class componentImplementation) throws IntrospectionException {
+ BeanPropertyModel beanPropertyModel = new BeanPropertyModel(componentImplementation);
+ ComponentNode componentNode = new ComponentNode(beanPropertyModel);
+ //treeModel.insertNodeInto(componentNode, containerNode, 0);
+
+ // now make a child node of the component displaying the property table.
+ DefaultMutableTreeNode propNode = new DefaultMutableTreeNode(new BeanPropertyTableModel(beanPropertyModel));
+ //treeModel.insertNodeInto(propNode, componentNode, 0);
+ }
+
+ public void displayInPropertyTable(BeanPropertyModel beanPropertyModel) {
+ BeanPropertyTableModel beanPropertyTableModel = new BeanPropertyTableModel(beanPropertyModel);
+ table.setModel(beanPropertyTableModel);
+ }
+}

----------

nano /picogui /src /java /org /picoextras /gui /swing

EditContainerPanel.java added at 1.1

diff -N EditContainerPanel.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ EditContainerPanel.java 17 Nov 2003 21:03:21 -0000 1.1
@@ -0,0 +1,25 @@

+package org.picoextras.gui.swing;
+
+import javax.swing.*;
+import javax.swing.text.Document;
+
+/**
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class EditContainerPanel extends JPanel {
+
+ public EditContainerPanel(AddPicoComponentAction addPicoComponentAction,
+ AddPicoContainerAction addPicoContainerAction,
+ ExecuteContainerAction executeContainerAction,
+ Document componentImplementationDocument) {
+
+ JTextField componentField = new JTextField(componentImplementationDocument,PicoGui.A.class.getName(), 25);
+ componentField.addActionListener(addPicoComponentAction);
+
+ add(componentField);
+ add(new JButton(addPicoComponentAction));
+ add(new JButton(addPicoContainerAction));
+ add(new JButton(executeContainerAction));
+ }
+}

----------

nano /picogui /src /java /org /picoextras /gui /swing

ExecuteContainerAction.java added at 1.1

diff -N ExecuteContainerAction.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ExecuteContainerAction.java 17 Nov 2003 21:03:21 -0000 1.1
@@ -0,0 +1,55 @@

+package org.picoextras.gui.swing;
+
+import org.picoextras.gui.model.*;
+import org.picocontainer.MutablePicoContainer;
+
+import javax.swing.*;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.event.TreeSelectionEvent;
+import java.awt.event.ActionEvent;
+
+/**
+ * Action that adds a new component. Enables itself if a container node
+ * is selected and the current classname is a loadabe class. Otherwise
+ * disabled.
+ *
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class ExecuteContainerAction extends AbstractAction implements TreeSelectionListener {
+ private ContainerNode selectedContainerNode = null;
+ private JTree treeToListenTo;
+
+ public ExecuteContainerAction(JTree treeToListenTo) {
+ super("Execute PicoContainer");
+ this.treeToListenTo = treeToListenTo;
+ treeToListenTo.addTreeSelectionListener(this);
+ setEnabled();
+ }
+
+ public void actionPerformed(ActionEvent evt) {
+ try {
+ // will call execute() on the components. Cuz we have such a smart,
+ // chained componentadapter
+ MutablePicoContainer picoContainer = selectedContainerNode.createPicoContainer();
+ picoContainer.getComponentInstances();
+ } catch (Exception e) {
+ JOptionPane.showMessageDialog(treeToListenTo,e.getStackTrace(),e.getClass().getName() + " " + e.getMessage(), JOptionPane.ERROR_MESSAGE);
+ }
+ }
+
+ public void valueChanged(TreeSelectionEvent evt) {
+ Object selected = evt.getPath().getLastPathComponent();
+ if(selected instanceof ContainerNode) {
+ selectedContainerNode = (ContainerNode) selected;
+ setEnabled();
+ } else {
+ selectedContainerNode = null;
+ setEnabled();
+ }
+ }
+
+ private void setEnabled() {
+ setEnabled(selectedContainerNode != null && selectedContainerNode.getChildCount() > 0);
+ }
+}

\ No newline at end of file

----------

nano /picogui /src /java /org /picoextras /gui /swing

PicoGui.java added at 1.1

diff -N PicoGui.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ PicoGui.java 17 Nov 2003 21:03:21 -0000 1.1
@@ -0,0 +1,120 @@

+package org.picoextras.gui.swing;
+
+import org.picoextras.gui.model.*;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.MutablePicoContainer;
+import org.picocontainer.defaults.DefaultPicoContainer;
+
+import javax.swing.*;
+import javax.swing.text.Document;
+import javax.swing.text.PlainDocument;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeCellEditor;
+import javax.swing.tree.DefaultTreeCellEditor;
+import javax.swing.tree.TreeModel;
+import java.awt.*;
+import java.util.EventObject;
+
+/**
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class PicoGui extends JPanel {
+
+ public PicoGui(PicoContainer picoContainer) {
+ super(new BorderLayout());
+
+// ContainerNode rootNode = new ContainerNode();
+
+ JSplitPane split = new JSplitPane();
+ JPanel left = new JPanel(new BorderLayout());
+
+ TreeModel treeModel = new PicoTreeModel(picoContainer);
+ final JTree tree = new JTree(treeModel);
+
+ new TreeExpander(tree);
+
+ PicoTreeCellRenderer picoTreeCellRenderer = new PicoTreeCellRenderer();
+ tree.setCellRenderer(picoTreeCellRenderer);
+
+ new DefaultTreeCellEditor(tree, picoTreeCellRenderer, null) {
+ };
+
+ left.add(new JScrollPane(tree), BorderLayout.CENTER);
+
+ JTable table = new JTable(BeanPropertyTableModel.EMPTY_MODEL);
+
+ // Set up a ComponentRegistrar
+ ComponentRegistrar componentRegistrar = new ComponentRegistrar(treeModel, table);
+
+ // Set up a PropertyTableCommander
+ new PropertyTableCommander(tree, componentRegistrar);
+
+ // Set up an AddPicoComponentAction
+ Document componentImplementationDocument = new PlainDocument();
+ AddPicoComponentAction addPicoComponentAction = new AddPicoComponentAction(
+ componentRegistrar,
+ tree,
+ tree,
+ componentImplementationDocument);
+
+ ExecuteContainerAction executeContainerAction = new ExecuteContainerAction(tree);
+
+ // Set up an AddPicoContainerAction
+ AddPicoContainerAction addPicoContainerAction = new AddPicoContainerAction(tree, treeModel, tree);
+
+ EditContainerPanel editContainerPanel = new EditContainerPanel(
+ addPicoComponentAction,
+ addPicoContainerAction,
+ executeContainerAction,
+ componentImplementationDocument
+ );
+ left.add(editContainerPanel, BorderLayout.NORTH);
+
+ JPanel right = new JPanel(new BorderLayout());
+
+ right.add(new JScrollPane(table), BorderLayout.CENTER);
+
+ split.setTopComponent(left);
+ split.setBottomComponent(right);
+ split.setOrientation(JSplitPane.VERTICAL_SPLIT);
+
+ add(split, BorderLayout.CENTER);
+ }
+
+ public static void main(String[] args) {
+ MutablePicoContainer root = new DefaultPicoContainer();
+ MutablePicoContainer child = new DefaultPicoContainer();
+ root.addChild(child);
+ root.registerComponentImplementation(A.class);
+
+ PicoGui gui = new PicoGui(root);
+
+ JFrame f = new JFrame();
+ f.getContentPane().add(gui);
+
+ f.setVisible(true);
+ f.pack();
+ }
+
+ public static class A {
+ private String message;
+
+ public void execute() {
+ System.out.println(message);
+ }
+
+ public A() {
+ System.out.println("A a = new A()");
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ System.out.println("a.setMessage(" + message + ")");
+ }
+
+ public String getMessage() {
+ return message;
+ }
+ }
+}

----------

nano /picogui /src /java /org /picoextras /gui /swing

PicoTreeCellRenderer.java added at 1.1

diff -N PicoTreeCellRenderer.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ PicoTreeCellRenderer.java 17 Nov 2003 21:03:21 -0000 1.1
@@ -0,0 +1,56 @@

+package org.picoextras.gui.swing;
+
+import org.picoextras.gui.model.ComponentNode;
+import org.picoextras.gui.model.BeanPropertyModel;
+import org.picoextras.gui.model.ContainerNode;
+import org.picoextras.gui.model.BeanPropertyTableModel;
+import org.picocontainer.PicoContainer;
+import org.picocontainer.ComponentAdapter;
+
+import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.*;
+import java.awt.*;
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+
+/**
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class PicoTreeCellRenderer extends DefaultTreeCellRenderer {
+ private final Icon picoContainerIcon = new ImageIcon(getClass().getResource("picocontainer.gif"));
+ private final Icon defaultComponentIcon = new ImageIcon(getClass().getResource("defaultcomponent.gif"));
+
+ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
+ JLabel label = (JLabel) super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
+ if( value instanceof ComponentNode ) {
+ BeanPropertyModel beanPropertyModel = (BeanPropertyModel) ((ComponentNode)value).getUserObject();
+ Class componentImplementation = beanPropertyModel.getBeanClass();
+ label.setText(componentImplementation.getName());
+ try {
+ BeanInfo beanInfo = Introspector.getBeanInfo(componentImplementation);
+ Image image = beanInfo.getIcon(BeanInfo.ICON_COLOR_16x16);
+ Icon icon;
+ if(image != null) {
+ icon = new ImageIcon(image);
+ } else {
+ icon = defaultComponentIcon;
+ }
+ label.setIcon(icon);
+ } catch (Exception e) {
+ JOptionPane.showMessageDialog(tree, e.getStackTrace());
+ }
+ } else if(value instanceof PicoContainer) {
+ label.setText("PicoContainer");
+ label.setIcon(picoContainerIcon);
+ } else if(value instanceof ComponentAdapter){
+// BeanPropertyTableModel beanPropertyTableModel = (BeanPropertyTableModel) ((DefaultMutableTreeNode)value).getUserObject();
+// return new JScrollPane( new JTable(beanPropertyTableModel));
+ ComponentAdapter componentAdapter = (ComponentAdapter) value;
+
+ label.setText(componentAdapter.getComponentImplementation().getName());
+ }
+ return label;
+ }
+}

----------

nano /picogui /src /java /org /picoextras /gui /swing

PicoTreeModel.java added at 1.1

diff -N PicoTreeModel.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ PicoTreeModel.java 17 Nov 2003 21:03:21 -0000 1.1
@@ -0,0 +1,77 @@

+package org.picoextras.gui.swing;
+
+import org.picocontainer.PicoContainer;
+
+import javax.swing.tree.TreeModel;
+import javax.swing.tree.TreePath;
+import javax.swing.event.TreeModelListener;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class PicoTreeModel implements TreeModel {
+ private final PicoContainer picoContainer;
+
+ public PicoTreeModel(PicoContainer picoContainer) {
+ this.picoContainer = picoContainer;
+ }
+
+ // TreeModel interface
+
+ public Object getRoot() {
+ return picoContainer;
+ }
+
+ public int getChildCount(Object parent) {
+ if (parent instanceof PicoContainer) {
+ PicoContainer pico = (PicoContainer) parent;
+ return pico.getChildContainers().size() + picoContainer.getComponentKeys().size();
+ } else {
+ return 0;
+ }
+ }
+
+ public boolean isLeaf(Object node) {
+ return !(node instanceof PicoContainer);
+ }
+
+ public void addTreeModelListener(TreeModelListener l) {
+
+ }
+
+ public void removeTreeModelListener(TreeModelListener l) {
+
+ }
+
+ public Object getChild(Object parent, int index) {
+ PicoContainer pico = (PicoContainer) parent;
+ List children = new ArrayList(pico.getChildContainers());
+ List componentKeys = new ArrayList(pico.getComponentKeys());
+
+ if (index < children.size()) {
+ return children.get(index);
+ } else {
+ Object componentKey = componentKeys.get(index - children.size());
+ return pico.findComponentAdapter(componentKey);
+ }
+ }
+
+ public int getIndexOfChild(Object parent, Object child) {
+ PicoContainer pico = (PicoContainer) parent;
+ List children = new ArrayList(pico.getChildContainers());
+ List componentKeys = new ArrayList(pico.getComponentKeys());
+
+ if (child instanceof PicoContainer) {
+ return children.indexOf(child);
+ } else {
+ return componentKeys.indexOf(child) + children.size();
+ }
+ }
+
+ public void valueForPathChanged(TreePath path, Object newValue) {
+
+ }
+}

----------

nano /picogui /src /java /org /picoextras /gui /swing

PropertyTableCommander.java added at 1.1

diff -N PropertyTableCommander.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ PropertyTableCommander.java 17 Nov 2003 21:03:21 -0000 1.1
@@ -0,0 +1,34 @@

+package org.picoextras.gui.swing;
+
+import org.picoextras.gui.model.ComponentNode;
+import org.picoextras.gui.model.BeanPropertyTableModel;
+import org.picoextras.gui.model.BeanPropertyModel;
+
+import javax.swing.*;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.event.TreeSelectionEvent;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class PropertyTableCommander implements TreeSelectionListener {
+
+ private final ComponentRegistrar componentRegistrar;
+
+ public PropertyTableCommander(JTree tree, ComponentRegistrar componentRegistrar){
+ this.componentRegistrar = componentRegistrar;
+ tree.addTreeSelectionListener(this);
+ }
+
+ public void valueChanged(TreeSelectionEvent evt) {
+ Object selected = evt.getPath().getLastPathComponent();
+ if(selected instanceof ComponentNode) {
+ ComponentNode componentTreeNode = (ComponentNode) selected;
+ BeanPropertyModel beanPropertyModel = (BeanPropertyModel) componentTreeNode.getUserObject();
+ componentRegistrar.displayInPropertyTable(beanPropertyModel);
+ }
+ }
+}

----------

nano /picogui /src /java /org /picoextras /gui /swing

TreeExpander.java added at 1.1

diff -N TreeExpander.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ TreeExpander.java 17 Nov 2003 21:03:22 -0000 1.1
@@ -0,0 +1,48 @@

+package org.picoextras.gui.swing;
+
+import javax.swing.event.TreeModelListener;
+import javax.swing.event.TreeModelEvent;
+import javax.swing.tree.TreePath;
+import javax.swing.*;
+
+/**
+ * This class makes sure new nodes are expanded and selected.
+ *
+ * @pico
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class TreeExpander implements TreeModelListener {
+
+ private final JTree tree;
+
+ public TreeExpander(JTree tree) {
+ this.tree = tree;
+ tree.getModel().addTreeModelListener(this);
+ }
+
+ public void treeNodesInserted(final TreeModelEvent evt) {
+ Object[] children = evt.getChildren();
+ final TreePath[] childPaths = new TreePath[children.length];
+
+ for (int i = 0; i < children.length; i++) {
+ Object child = children[i];
+ childPaths[i] = evt.getTreePath().pathByAddingChild(child);
+ }
+
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ tree.setSelectionPaths(childPaths);
+ }
+ });
+ }
+
+ public void treeNodesChanged(TreeModelEvent evt) {
+ }
+
+ public void treeNodesRemoved(TreeModelEvent evt) {
+ }
+
+ public void treeStructureChanged(TreeModelEvent evt) {
+ }
+}