[CVS nano] update

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

BeanPropertyModel.java +60 added 1.1

BeanPropertyTableModel.java +65 added 1.1

ComponentNode.java +13 added 1.1

ContainerNode.java +55 added 1.1

ContainerNodeTestCase.java +60 added 1.1

+253

5 added files

update

----------

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

BeanPropertyModel.java added at 1.1

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

+package org.picoextras.gui.model;
+
+import java.beans.PropertyDescriptor;
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.IntrospectionException;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * A model for a bean that
+ *
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class BeanPropertyModel {
+ private final Map propertyMap = new HashMap();
+
+ private final PropertyDescriptor[] propertyDescriptors;
+ private final Object[] propertyValues;
+ private final Class beanClass;
+
+ public BeanPropertyModel(Class beanClass) throws IntrospectionException {
+ this.beanClass = beanClass;
+ BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
+ propertyDescriptors = beanInfo.getPropertyDescriptors();
+ propertyValues = new Object[propertyDescriptors.length];
+ }
+
+ public PropertyDescriptor getPropertyDescriptor(int index) {
+ return propertyDescriptors[index];
+ }
+
+ public Object getPropertyValue(int index) {
+ return propertyValues[index];
+ }
+
+ public void setPropertyValue(Object value, int index) {
+ // verify the type
+ Class propertyType = getPropertyDescriptor(index).getPropertyType();
+ if(!propertyType.isInstance(value)) throw new IllegalArgumentException("Bad value. Expected a " + propertyType.getName() + ". Got a " + value.getClass().getName());
+ propertyValues[index] = value;
+
+ // now set it in the map too.
+ String propertyName = getPropertyDescriptor(index).getName();
+ propertyMap.put(propertyName, value);
+ }
+
+ public int getSize() {
+ return propertyDescriptors.length;
+ }
+
+ public Class getBeanClass() {
+ return beanClass;
+ }
+
+ public Map getPropertyMap() {
+ return propertyMap;
+ }
+}

----------

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

BeanPropertyTableModel.java added at 1.1

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

+package org.picoextras.gui.model;
+
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableModel;
+import javax.swing.event.TableModelListener;
+
+/**
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class BeanPropertyTableModel implements TableModel {
+ private static final String[] TABLE_HEADER = new String[]{"Property", "Value"};
+ public static final TableModel EMPTY_MODEL = new DefaultTableModel(BeanPropertyTableModel.TABLE_HEADER, 0);
+
+ private final BeanPropertyModel beanPropertyModel;
+
+ public BeanPropertyTableModel(BeanPropertyModel model) {
+ this.beanPropertyModel = model;
+ }
+
+ public int getColumnCount() {
+ return 2;
+ }
+
+ public int getRowCount() {
+ return beanPropertyModel.getSize();
+ }
+
+ public boolean isCellEditable(int rowIndex, int columnIndex) {
+ boolean hasWriteMethod = beanPropertyModel.getPropertyDescriptor(rowIndex).getWriteMethod() != null;
+ return columnIndex == 1 && hasWriteMethod;
+ }
+
+ public Class getColumnClass(int columnIndex) {
+ return Object.class;
+ }
+
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ if (columnIndex == 0) {
+ return beanPropertyModel.getPropertyDescriptor(rowIndex).getDisplayName();
+ } else {
+ return beanPropertyModel.getPropertyValue(rowIndex);
+ }
+ }
+
+ public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
+ beanPropertyModel.setPropertyValue(aValue, rowIndex);
+ }
+
+ public String getColumnName(int columnIndex) {
+ return TABLE_HEADER[columnIndex];
+ }
+
+ public void addTableModelListener(TableModelListener l) {
+
+ }
+
+ public void removeTableModelListener(TableModelListener l) {
+
+ }
+
+ public Object getBeanPropertyModel() {
+ return beanPropertyModel;
+ }
+}

----------

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

ComponentNode.java added at 1.1

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

+package org.picoextras.gui.model;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+
+/**
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class ComponentNode extends DefaultMutableTreeNode {
+ public ComponentNode(BeanPropertyModel beanPropertyModel) {
+ super(beanPropertyModel);
+ }
+}

----------

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

ContainerNode.java added at 1.1

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

+package org.picoextras.gui.model;
+
+import org.picocontainer.*;
+import org.picocontainer.extras.BeanPropertyComponentAdapterFactory;
+import org.picocontainer.defaults.*;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreeNode;
+import java.util.Map;
+
+/**
+ * Usage pattern:
+ * <p>
+ * ContainerNode newChild = root.createRegistryChild(new DefaultComponentRegistry());
+ * model.insertNodeInto(root, newChild, 0);
+ *
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class ContainerNode extends DefaultMutableTreeNode {
+ public ContainerNode() {
+ super(new Object());
+ }
+
+ public MutablePicoContainer createPicoContainer() throws PicoInitializationException {
+ BeanPropertyComponentAdapterFactory propertyFactory = new BeanPropertyComponentAdapterFactory(new DefaultComponentAdapterFactory());
+
+ MutablePicoContainer result;
+ if(getParent() != null) {
+ ContainerNode parent = (ContainerNode) getParent();
+ MutablePicoContainer parentContainer = parent.createPicoContainer();
+ result = new DefaultPicoContainer(propertyFactory);
+ result.addParent(parentContainer);
+ } else {
+ result = new DefaultPicoContainer(propertyFactory);
+ }
+
+ int childCount = getChildCount();
+ for(int i = 0; i < childCount; i++) {
+ TreeNode child = getChildAt(i);
+ if(child instanceof ComponentNode) {
+ ComponentNode componentNode = (ComponentNode) child;
+ BeanPropertyModel beanPropertyModel = (BeanPropertyModel) componentNode.getUserObject();
+
+ Class componentImplementation = beanPropertyModel.getBeanClass();
+
+ Map propertyMap = beanPropertyModel.getPropertyMap();
+ propertyFactory.setProperties(componentImplementation, propertyMap);
+
+ result.registerComponentImplementation(componentImplementation);
+ }
+ }
+ return result;
+ }
+}

----------

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

ContainerNodeTestCase.java added at 1.1

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

+package org.picoextras.gui.model;
+
+import junit.framework.TestCase;
+import org.picocontainer.PicoContainer;
+
+import java.util.ArrayList;
+import java.beans.IntrospectionException;
+
+/**
+ * @author Aslak Helles&oslash;y
+ * @version $Revision: 1.1 $
+ */
+public class ContainerNodeTestCase extends TestCase {
+
+ public void testEmptyContainerNodeCreatesEmptyContainer() {
+ ContainerNode containerNode = new ContainerNode();
+ PicoContainer container = containerNode.createPicoContainer();
+ assertEquals(0, container.getComponentKeys().size());
+ }
+
+ public void testContainerNodeWithChildrenCreatesContainerWithComponents() throws IntrospectionException {
+ ContainerNode containerNode = new ContainerNode();
+
+ ComponentNode stringNode = new ComponentNode(new BeanPropertyModel(String.class));
+ ComponentNode listNode = new ComponentNode(new BeanPropertyModel(ArrayList.class));
+
+ containerNode.add(stringNode);
+ containerNode.add(listNode);
+
+ PicoContainer container = containerNode.createPicoContainer();
+ assertEquals("", container.getComponentInstance(String.class));
+ assertEquals(new ArrayList(), container.getComponentInstance(ArrayList.class));
+ }
+
+ public void testChildContainerNodeCreatesHierarchicalContainer() throws IntrospectionException {
+ ContainerNode parentContainerNode = new ContainerNode();
+ ContainerNode childContainerNode = new ContainerNode();
+ parentContainerNode.add(childContainerNode);
+
+ ComponentNode fooNode = new ComponentNode(new BeanPropertyModel(Foo.class));
+ ComponentNode needsFooNode = new ComponentNode(new BeanPropertyModel(NeedsFoo.class));
+
+ parentContainerNode.add(fooNode);
+ childContainerNode.add(needsFooNode);
+
+ PicoContainer container = childContainerNode.createPicoContainer();
+ assertNotNull(container.getComponentInstance(NeedsFoo.class));
+ }
+
+ public void testPropertiesAreSetOnComponents() throws IntrospectionException {
+// ContainerNode containerNode = new ContainerNode();
+// ComponentNode fooNode = new ComponentNode(new BeanPropertyModel(Foo.class));
+// containerNode.add(fooNode);
+//
+// PicoContainer container = containerNode.createPicoContainer();
+// Foo foo = (Foo) container.getComponentInstance(Foo.class);
+// assertEquals("hello", foo.getBar());
+ }
+
+}