You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by fm...@apache.org on 2011/04/24 14:47:49 UTC

svn commit: r1096321 - in /chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main: java/org/apache/chemistry/opencmis/workbench/ java/org/apache/chemistry/opencmis/workbench/details/ java/org/apache/chemistry/opencm...

Author: fmui
Date: Sun Apr 24 12:47:48 2011
New Revision: 1096321

URL: http://svn.apache.org/viewvc?rev=1096321&view=rev
Log:
- added mutli value support to the CMIS Workbench property editor
- a few other Workbench improvements (content URL, paths, etc.)

Added:
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/add.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/down.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/remove.png   (with props)
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/up.png   (with props)
Removed:
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/META-INF/build-timestamp.txt
Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/ClientHelper.java
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/PropertyEditorFrame.java
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/AbstractDetailsTable.java
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PropertyTable.java
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/CollectionRenderer.java
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/InfoPanel.java
    chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/META-INF/README

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/ClientHelper.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/ClientHelper.java?rev=1096321&r1=1096320&r2=1096321&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/ClientHelper.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/ClientHelper.java Sun Apr 24 12:47:48 2011
@@ -76,7 +76,12 @@ public class ClientHelper {
             }
         }
 
-        JOptionPane.showMessageDialog(parent, ex.getClass().getSimpleName() + "\n" + ex.getMessage(), "Error",
+        String exceptionName = ex.getClass().getSimpleName();
+        if (ex instanceof CmisBaseException) {
+            exceptionName = ((CmisBaseException) ex).getExceptionName();
+        }
+
+        JOptionPane.showMessageDialog(parent, exceptionName + ":\n" + ex.getMessage(), "Error",
                 JOptionPane.ERROR_MESSAGE);
     }
 
@@ -159,6 +164,7 @@ public class ClientHelper {
             file = createTempFileFromDocument(object, streamId);
         } catch (Exception e) {
             showError(component, e);
+            return;
         }
 
         try {

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/PropertyEditorFrame.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/PropertyEditorFrame.java?rev=1096321&r1=1096320&r2=1096321&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/PropertyEditorFrame.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/PropertyEditorFrame.java Sun Apr 24 12:47:48 2011
@@ -21,6 +21,7 @@ package org.apache.chemistry.opencmis.wo
 import java.awt.BorderLayout;
 import java.awt.Color;
 import java.awt.Dimension;
+import java.awt.FlowLayout;
 import java.awt.Font;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
@@ -30,13 +31,16 @@ import java.text.Format;
 import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
+import java.util.Collections;
 import java.util.GregorianCalendar;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
 import javax.swing.BorderFactory;
 import javax.swing.BoxLayout;
+import javax.swing.ImageIcon;
 import javax.swing.JButton;
 import javax.swing.JComboBox;
 import javax.swing.JComponent;
@@ -45,12 +49,10 @@ import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
-import javax.swing.JSeparator;
 import javax.swing.JSpinner;
 import javax.swing.JTextField;
 import javax.swing.SpinnerListModel;
 import javax.swing.SpinnerNumberModel;
-import javax.swing.SwingConstants;
 import javax.swing.UIManager;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
@@ -72,12 +74,13 @@ public class PropertyEditorFrame extends
     private static final long serialVersionUID = 1L;
 
     private static final String WINDOW_TITLE = "Property Editor";
+    private static final ImageIcon ICON_ADD = ClientHelper.getIcon("add.png");
 
     private final ClientModel model;
     private final CmisObject object;
     private List<PropertyInputPanel> propertyPanels;
 
-    public PropertyEditorFrame(ClientModel model, CmisObject object) {
+    public PropertyEditorFrame(final ClientModel model, final CmisObject object) {
         super();
 
         this.model = model;
@@ -88,19 +91,32 @@ public class PropertyEditorFrame extends
 
     private void createGUI() {
         setTitle(WINDOW_TITLE);
-        setPreferredSize(new Dimension(600, 600));
-        setMinimumSize(new Dimension(200, 60));
+        setPreferredSize(new Dimension(800, 600));
+        setMinimumSize(new Dimension(300, 120));
 
         setLayout(new BorderLayout());
 
-        JPanel panel = new JPanel();
+        final JPanel panel = new JPanel();
         panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
 
+        final Font labelFont = UIManager.getFont("Label.font");
+        final Font boldFont = labelFont.deriveFont(Font.BOLD, labelFont.getSize2D() * 1.2f);
+
+        final JPanel topPanel = new JPanel();
+        topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS));
+        topPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+        final JLabel nameLabel = new JLabel(object.getName());
+        nameLabel.setFont(boldFont);
+        topPanel.add(nameLabel);
+        topPanel.add(new JLabel(object.getId()));
+        add(topPanel, BorderLayout.PAGE_START);
+
         JScrollPane scrollPane = new JScrollPane(panel);
         add(scrollPane, BorderLayout.CENTER);
 
         propertyPanels = new ArrayList<PropertyEditorFrame.PropertyInputPanel>();
 
+        int position = 0;
         for (PropertyDefinition<?> propDef : object.getType().getPropertyDefinitions().values()) {
             boolean isUpdatable = (propDef.getUpdatability() == Updatability.READWRITE)
                     || (propDef.getUpdatability() == Updatability.WHENCHECKEDOUT && object.getAllowableActions()
@@ -108,7 +124,7 @@ public class PropertyEditorFrame extends
 
             if (isUpdatable) {
                 PropertyInputPanel propertyPanel = new PropertyInputPanel(propDef, object.getPropertyValue(propDef
-                        .getId()));
+                        .getId()), position++);
 
                 propertyPanels.add(propertyPanel);
                 panel.add(propertyPanel);
@@ -116,6 +132,7 @@ public class PropertyEditorFrame extends
         }
 
         JButton updateButton = new JButton("Update");
+        updateButton.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
         updateButton.setDefaultCapable(true);
         updateButton.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent event) {
@@ -151,14 +168,12 @@ public class PropertyEditorFrame extends
 
             ObjectId newId = object.updateProperties(properties, false);
 
-            if (newId != null) {
-                if (newId.getId().equals(model.getCurrentObject().getId())) {
-                    try {
-                        model.reloadObject();
-                        model.reloadFolder();
-                    } catch (Exception ex) {
-                        ClientHelper.showError(null, ex);
-                    }
+            if ((newId != null) && newId.getId().equals(model.getCurrentObject().getId())) {
+                try {
+                    model.reloadObject();
+                    model.reloadFolder();
+                } catch (Exception ex) {
+                    ClientHelper.showError(null, ex);
                 }
             }
 
@@ -169,7 +184,7 @@ public class PropertyEditorFrame extends
         }
     }
 
-    public interface UpdateStatus {
+    interface UpdateStatus {
         enum StatusFlag {
             DontChange, Update, Unset
         }
@@ -179,49 +194,73 @@ public class PropertyEditorFrame extends
         StatusFlag getStatus();
     }
 
+    interface MultivalueManager {
+        void addNewValue();
+
+        void removeValue(int pos);
+
+        void moveUp(int pos);
+
+        void moveDown(int pos);
+    }
+
     /**
      * Property input panel.
      */
-    public static class PropertyInputPanel extends JPanel implements UpdateStatus {
+    public static class PropertyInputPanel extends JPanel implements UpdateStatus, MultivalueManager {
         private static final long serialVersionUID = 1L;
 
+        private static final Color BACKGROUND1 = UIManager.getColor("Table:\"Table.cellRenderer\".background");
+        private static final Color BACKGROUND2 = UIManager.getColor("Table.alternateRowColor");
+        private static final Color LINE = new Color(0xB8, 0xB8, 0xB8);
+
         private final PropertyDefinition<?> propDef;
         private final Object value;
+        private final Color bgColor;
         private JComboBox changeBox;
-        private List<JComponent> valueComponents;
+        private LinkedList<JComponent> valueComponents;
 
-        public PropertyInputPanel(PropertyDefinition<?> propDef, Object value) {
+        public PropertyInputPanel(PropertyDefinition<?> propDef, Object value, int position) {
             super();
             this.propDef = propDef;
             this.value = value;
+            bgColor = (position % 2 == 0 ? BACKGROUND1 : BACKGROUND2);
             createGUI();
         }
 
-        protected void createGUI() {
+        private void createGUI() {
             setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
 
-            setBackground(Color.WHITE);
-            setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+            setBackground(bgColor);
+            setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, LINE),
+                    BorderFactory.createEmptyBorder(10, 5, 10, 5)));
 
             Font labelFont = UIManager.getFont("Label.font");
             Font boldFont = labelFont.deriveFont(Font.BOLD, labelFont.getSize2D() * 1.2f);
 
             JPanel titlePanel = new JPanel();
             titlePanel.setLayout(new BorderLayout());
-            titlePanel.setBackground(Color.WHITE);
+            titlePanel.setBackground(bgColor);
             titlePanel.setToolTipText("<html><b>" + propDef.getPropertyType().value() + "</b> ("
                     + propDef.getCardinality().value() + " value)"
                     + (propDef.getDescription() != null ? "<br>" + propDef.getDescription() : ""));
             add(titlePanel);
 
-            JLabel label = new JLabel(propDef.getDisplayName() + " (" + propDef.getId() + ")");
-            label.setFont(boldFont);
-            titlePanel.add(label, BorderLayout.LINE_START);
+            JPanel namePanel = new JPanel();
+            namePanel.setLayout(new BoxLayout(namePanel, BoxLayout.Y_AXIS));
+            namePanel.setBackground(bgColor);
+            JLabel displayNameLabel = new JLabel(propDef.getDisplayName());
+            displayNameLabel.setFont(boldFont);
+            namePanel.add(displayNameLabel);
+            JLabel idLabel = new JLabel(propDef.getId());
+            namePanel.add(idLabel);
+
+            titlePanel.add(namePanel, BorderLayout.LINE_START);
 
             changeBox = new JComboBox(new Object[] { "Don't change     ", "Update    ", "Unset     " });
             titlePanel.add(changeBox, BorderLayout.LINE_END);
 
-            valueComponents = new ArrayList<JComponent>();
+            valueComponents = new LinkedList<JComponent>();
             if (propDef.getCardinality() == Cardinality.SINGLE) {
                 JComponent valueField = createInputField(value);
                 valueComponents.add(valueField);
@@ -229,33 +268,100 @@ public class PropertyEditorFrame extends
             } else {
                 if (value instanceof List<?>) {
                     for (Object v : (List<?>) value) {
-                        JComponent valueField = createInputField(v);
+                        JComponent valueField = new MultiValuePropertyInputField(createInputField(v), this, bgColor);
                         valueComponents.add(valueField);
                         add(valueField);
                     }
+
+                    JPanel addPanel = new JPanel(new BorderLayout());
+                    addPanel.setBackground(bgColor);
+                    JButton addButton = new JButton(ICON_ADD);
+                    addButton.addActionListener(new ActionListener() {
+                        @Override
+                        public void actionPerformed(ActionEvent e) {
+                            addNewValue();
+                            setStatus(StatusFlag.Update);
+                        }
+                    });
+                    addPanel.add(addButton, BorderLayout.LINE_END);
+                    add(addPanel);
+
+                    updatePositions();
                 }
             }
 
-            add(new JSeparator(SwingConstants.HORIZONTAL));
-
             setMaximumSize(new Dimension(Short.MAX_VALUE, getPreferredSize().height));
         }
 
         protected JComponent createInputField(Object value) {
             switch (propDef.getPropertyType()) {
             case INTEGER:
-                return new IntegerPropertyInputField(value, this);
+                return new IntegerPropertyInputField(value, this, bgColor);
             case DECIMAL:
-                return new DecimalPropertyInputField(value, this);
+                return new DecimalPropertyInputField(value, this, bgColor);
             case DATETIME:
-                return new DateTimePropertyInputField(value, this);
+                return new DateTimePropertyInputField(value, this, bgColor);
             case BOOLEAN:
-                return new BooleanPropertyInputField(value, this);
+                return new BooleanPropertyInputField(value, this, bgColor);
             default:
-                return new StringPropertyInputField(value, this);
+                return new StringPropertyInputField(value, this, bgColor);
+            }
+        }
+
+        private void updatePositions() {
+            int n = valueComponents.size();
+            for (int i = 0; i < n; i++) {
+                MultiValuePropertyInputField comp = (MultiValuePropertyInputField) valueComponents.get(i);
+                comp.updatePosition(i, i + 1 == n);
             }
         }
 
+        public void addNewValue() {
+            JComponent valueField = new MultiValuePropertyInputField(createInputField(null), this, bgColor);
+            valueComponents.add(valueField);
+            add(valueField, getComponentCount() - 1);
+
+            updatePositions();
+            setStatus(StatusFlag.Update);
+
+            revalidate();
+        }
+
+        public void removeValue(int pos) {
+            remove(valueComponents.remove(pos));
+
+            updatePositions();
+            setStatus(StatusFlag.Update);
+
+            revalidate();
+        }
+
+        public void moveUp(int pos) {
+            JComponent comp = valueComponents.get(pos);
+            Collections.swap(valueComponents, pos, pos - 1);
+
+            remove(comp);
+            add(comp, pos);
+
+            updatePositions();
+            setStatus(StatusFlag.Update);
+
+            revalidate();
+        }
+
+        public void moveDown(int pos) {
+            JComponent comp = valueComponents.get(pos);
+            Collections.swap(valueComponents, pos, pos + 1);
+
+            remove(comp);
+            add(comp, pos + 2);
+
+            updatePositions();
+            setStatus(StatusFlag.Update);
+
+            revalidate();
+        }
+
         public String getId() {
             return propDef.getId();
         }
@@ -309,6 +415,12 @@ public class PropertyEditorFrame extends
                 return StatusFlag.DontChange;
             }
         }
+
+        public Dimension getMaximumSize() {
+            Dimension size = getPreferredSize();
+            size.width = Short.MAX_VALUE;
+            return size;
+        }
     }
 
     /**
@@ -324,7 +436,7 @@ public class PropertyEditorFrame extends
     public static class StringPropertyInputField extends JTextField implements PropertyValue {
         private static final long serialVersionUID = 1L;
 
-        public StringPropertyInputField(final Object value, final UpdateStatus status) {
+        public StringPropertyInputField(final Object value, final UpdateStatus status, final Color bgColor) {
             super(value == null ? "" : value.toString());
 
             addKeyListener(new KeyListener() {
@@ -354,7 +466,8 @@ public class PropertyEditorFrame extends
     public static class AbstractFormattedPropertyInputField extends JFormattedTextField implements PropertyValue {
         private static final long serialVersionUID = 1L;
 
-        public AbstractFormattedPropertyInputField(final Object value, final Format format, final UpdateStatus status) {
+        public AbstractFormattedPropertyInputField(final Object value, final Format format, final UpdateStatus status,
+                final Color bgColor) {
             super(format);
             if (value != null) {
                 setValue(value);
@@ -388,8 +501,8 @@ public class PropertyEditorFrame extends
     public static class IntegerPropertyInputField extends AbstractFormattedPropertyInputField {
         private static final long serialVersionUID = 1L;
 
-        public IntegerPropertyInputField(final Object value, final UpdateStatus status) {
-            super(value, NumberFormat.getIntegerInstance(), status);
+        public IntegerPropertyInputField(final Object value, final UpdateStatus status, final Color bgColor) {
+            super(value, NumberFormat.getIntegerInstance(), status, bgColor);
             setHorizontalAlignment(JTextField.RIGHT);
         }
     }
@@ -400,8 +513,8 @@ public class PropertyEditorFrame extends
     public static class DecimalPropertyInputField extends AbstractFormattedPropertyInputField {
         private static final long serialVersionUID = 1L;
 
-        public DecimalPropertyInputField(final Object value, final UpdateStatus status) {
-            super(value, NumberFormat.getInstance(), status);
+        public DecimalPropertyInputField(final Object value, final UpdateStatus status, final Color bgColor) {
+            super(value, NumberFormat.getInstance(), status, bgColor);
             setHorizontalAlignment(JTextField.RIGHT);
         }
     }
@@ -412,7 +525,7 @@ public class PropertyEditorFrame extends
     public static class BooleanPropertyInputField extends JComboBox implements PropertyValue {
         private static final long serialVersionUID = 1L;
 
-        public BooleanPropertyInputField(final Object value, final UpdateStatus status) {
+        public BooleanPropertyInputField(final Object value, final UpdateStatus status, final Color bgColor) {
             super(new Object[] { true, false });
             setSelectedItem(value == null ? true : value);
 
@@ -450,15 +563,16 @@ public class PropertyEditorFrame extends
             }
         }
 
-        private SpinnerNumberModel day;
-        private SpinnerListModel month;
-        private SpinnerNumberModel year;
-        private SpinnerNumberModel hour;
-        private SpinnerNumberModel min;
-        private SpinnerNumberModel sec;
-
-        public DateTimePropertyInputField(final Object value, final UpdateStatus status) {
-            setBackground(Color.WHITE);
+        private final SpinnerNumberModel day;
+        private final SpinnerListModel month;
+        private final SpinnerNumberModel year;
+        private final SpinnerNumberModel hour;
+        private final SpinnerNumberModel min;
+        private final SpinnerNumberModel sec;
+
+        public DateTimePropertyInputField(final Object value, final UpdateStatus status, final Color bgColor) {
+            setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
+            setBackground(bgColor);
 
             GregorianCalendar cal = (value == null ? new GregorianCalendar() : (GregorianCalendar) value);
 
@@ -479,23 +593,26 @@ public class PropertyEditorFrame extends
             year = new SpinnerNumberModel(cal.get(Calendar.YEAR), 0, 9999, 1);
             JSpinner yearSpinner = new JSpinner(year);
             yearSpinner.setEditor(new JSpinner.NumberEditor(yearSpinner, "#"));
-            editor = yearSpinner.getEditor();
+            yearSpinner.getEditor().setBackground(bgColor);
             addSpinner(yearSpinner, status);
 
             add(new JLabel("  "));
 
             hour = new SpinnerNumberModel(cal.get(Calendar.HOUR_OF_DAY), 0, 23, 1);
-            addSpinner(new JSpinner(hour), status);
+            JSpinner hourSpinner = new JSpinner(hour);
+            addSpinner(hourSpinner, status);
 
             add(new JLabel(":"));
 
             min = new SpinnerNumberModel(cal.get(Calendar.MINUTE), 0, 59, 1);
-            addSpinner(new JSpinner(min), status);
+            JSpinner minSpinner = new JSpinner(min);
+            addSpinner(minSpinner, status);
 
             add(new JLabel(":"));
 
             sec = new SpinnerNumberModel(cal.get(Calendar.SECOND), 0, 59, 1);
-            addSpinner(new JSpinner(sec), status);
+            JSpinner secSpinner = new JSpinner(sec);
+            addSpinner(secSpinner, status);
         }
 
         private void addSpinner(final JSpinner spinner, final UpdateStatus status) {
@@ -530,4 +647,74 @@ public class PropertyEditorFrame extends
             return result;
         }
     }
+
+    /**
+     * Multi value property.
+     */
+    public static class MultiValuePropertyInputField extends JPanel implements PropertyValue {
+        private static final long serialVersionUID = 1L;
+
+        private static final ImageIcon ICON_UP = ClientHelper.getIcon("up.png");
+        private static final ImageIcon ICON_DOWN = ClientHelper.getIcon("down.png");
+        private static final ImageIcon ICON_REMOVE = ClientHelper.getIcon("remove.png");
+
+        private final JComponent component;
+        private int position;
+
+        private JButton upButton;
+        private JButton downButton;
+
+        public MultiValuePropertyInputField(final JComponent component, final MultivalueManager mutlivalueManager,
+                final Color bgColor) {
+            super();
+            this.component = component;
+
+            setLayout(new BorderLayout());
+            setBackground(bgColor);
+
+            add(component, BorderLayout.CENTER);
+
+            JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 0, 0));
+            buttonPanel.setBackground(bgColor);
+
+            upButton = new JButton(ICON_UP);
+            upButton.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    mutlivalueManager.moveUp(MultiValuePropertyInputField.this.position);
+                }
+            });
+            buttonPanel.add(upButton);
+
+            downButton = new JButton(ICON_DOWN);
+            downButton.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    mutlivalueManager.moveDown(MultiValuePropertyInputField.this.position);
+                }
+            });
+            buttonPanel.add(downButton);
+
+            JButton removeButton = new JButton(ICON_REMOVE);
+            removeButton.addActionListener(new ActionListener() {
+                @Override
+                public void actionPerformed(ActionEvent e) {
+                    mutlivalueManager.removeValue(MultiValuePropertyInputField.this.position);
+                }
+            });
+            buttonPanel.add(removeButton);
+
+            add(buttonPanel, BorderLayout.LINE_END);
+        }
+
+        public void updatePosition(int position, boolean isLast) {
+            this.position = position;
+            upButton.setEnabled(position > 0);
+            downButton.setEnabled(!isLast);
+        }
+
+        public Object getPropertyValue() throws Exception {
+            return ((PropertyValue) component).getPropertyValue();
+        }
+    }
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/AbstractDetailsTable.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/AbstractDetailsTable.java?rev=1096321&r1=1096320&r2=1096321&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/AbstractDetailsTable.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/AbstractDetailsTable.java Sun Apr 24 12:47:48 2011
@@ -129,6 +129,10 @@ public abstract class AbstractDetailsTab
         return model.getCurrentObject();
     }
 
+    public ClientModel getClientModel() {
+        return model;
+    }
+
     public String[] getColumnNames() {
         return columnNames;
     }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java?rev=1096321&r1=1096320&r2=1096321&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/ObjectPanel.java Sun Apr 24 12:47:48 2011
@@ -21,17 +21,18 @@ package org.apache.chemistry.opencmis.wo
 import java.awt.Cursor;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.List;
 
 import javax.swing.JButton;
-import javax.swing.JList;
 import javax.swing.JTextField;
+import javax.swing.SwingUtilities;
 
 import org.apache.chemistry.opencmis.client.api.CmisObject;
+import org.apache.chemistry.opencmis.client.api.FileableCmisObject;
+import org.apache.chemistry.opencmis.client.api.Folder;
 import org.apache.chemistry.opencmis.client.api.Session;
-import org.apache.chemistry.opencmis.client.bindings.spi.atompub.AbstractAtomPubService;
-import org.apache.chemistry.opencmis.client.bindings.spi.atompub.AtomPubParser;
-import org.apache.chemistry.opencmis.client.bindings.spi.atompub.ObjectServiceImpl;
+import org.apache.chemistry.opencmis.client.bindings.spi.atompub.LinkAccess;
 import org.apache.chemistry.opencmis.workbench.ClientHelper;
 import org.apache.chemistry.opencmis.workbench.model.ClientModel;
 import org.apache.chemistry.opencmis.workbench.model.ClientModelEvent;
@@ -48,8 +49,9 @@ public class ObjectPanel extends InfoPan
     private JTextField idField;
     private JTextField typeField;
     private JTextField basetypeField;
-    // private JTextField contentUrlField;
-    private JList allowableActionsList;
+    private JTextField contentUrlField;
+    private InfoList paths;
+    private InfoList allowableActionsList;
     private JButton refreshButton;
 
     public ObjectPanel(ClientModel model) {
@@ -69,7 +71,8 @@ public class ObjectPanel extends InfoPan
             idField.setText("");
             typeField.setText("");
             basetypeField.setText("");
-            // contentUrlField.setText("");
+            paths.removeAll();
+            contentUrlField.setText("");
             allowableActionsList.removeAll();
             refreshButton.setEnabled(false);
         } else {
@@ -78,19 +81,54 @@ public class ObjectPanel extends InfoPan
                 idField.setText(object.getId());
                 typeField.setText(object.getType().getId());
                 basetypeField.setText(object.getBaseTypeId().toString());
-                // String docUrl = getDocumentURL(object,
-                // model.getClientSession().getSession());
-                // contentUrlField.setText(docUrl == null ? "" : docUrl);
+
+                if (object instanceof FileableCmisObject) {
+                    if (object instanceof Folder) {
+                        paths.setList(Collections.singletonList(((Folder) object).getPath()));
+                    } else {
+                        paths.setList(Collections.singletonList(""));
+                        final FileableCmisObject pathObject = (FileableCmisObject) object;
+                        SwingUtilities.invokeLater(new Runnable() {
+                            @Override
+                            public void run() {
+                                try {
+                                    List<String> pathsList = (pathObject).getPaths();
+                                    if ((pathsList == null) || (pathsList.size() == 0)) {
+                                        paths.setList(Collections.singletonList("(unfiled)"));
+                                    } else {
+                                        paths.setList(pathsList);
+                                    }
+                                } catch (Exception e) {
+                                    paths.setList(Collections.singletonList("(???)"));
+                                }
+                                ObjectPanel.this.revalidate();
+                            }
+                        });
+                    }
+                } else {
+                    paths.setList(Collections.singletonList("(not filable)"));
+                }
+
+                String docUrl = getDocumentURL(object, model.getClientSession().getSession());
+                if (docUrl != null) {
+                    contentUrlField.setText(docUrl);
+                } else {
+                    contentUrlField.setText("(not available)");
+                }
+
                 if (object.getAllowableActions() != null) {
-                    allowableActionsList.setListData(object.getAllowableActions().getAllowableActions().toArray());
+                    allowableActionsList.setList(object.getAllowableActions().getAllowableActions());
                 } else {
-                    allowableActionsList.setListData(new String[] { "(missing)" });
+                    allowableActionsList.setList(Collections.singletonList("(missing)"));
                 }
+
                 refreshButton.setEnabled(true);
             } catch (Exception e) {
                 ClientHelper.showError(this, e);
             }
         }
+
+        revalidate();
     }
 
     private void createGUI() {
@@ -100,8 +138,9 @@ public class ObjectPanel extends InfoPan
         idField = addLine("Id:");
         typeField = addLine("Type:");
         basetypeField = addLine("Base Type:");
-        // contentUrlField = addLine("Content URL:");
-        allowableActionsList = addComponent("Allowable Actions:", new JList());
+        paths = addComponent("Paths:", new InfoList());
+        contentUrlField = addLink("Content URL:");
+        allowableActionsList = addComponent("Allowable Actions:", new InfoList());
         refreshButton = addComponent("", new JButton("Refresh"));
         refreshButton.setEnabled(false);
 
@@ -120,22 +159,11 @@ public class ObjectPanel extends InfoPan
     }
 
     public String getDocumentURL(final CmisObject document, final Session session) {
-        String link = null;
-
-        if (!(session.getBinding().getObjectService() instanceof ObjectServiceImpl)) {
-            return null;
-        }
-
-        try {
-            Method loadLink = AbstractAtomPubService.class.getDeclaredMethod("loadLink", new Class[] { String.class,
-                    String.class, String.class, String.class });
-            loadLink.setAccessible(true);
-            link = (String) loadLink.invoke(session.getBinding().getObjectService(), session.getRepositoryInfo()
-                    .getId(), document.getId(), AtomPubParser.LINK_REL_CONTENT, null);
-        } catch (Exception e) {
-            e.printStackTrace();
+        if (session.getBinding().getObjectService() instanceof LinkAccess) {
+            return ((LinkAccess) session.getBinding().getObjectService()).loadContentLink(session.getRepositoryInfo()
+                    .getId(), document.getId());
         }
 
-        return link;
+        return null;
     }
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PropertyTable.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PropertyTable.java?rev=1096321&r1=1096320&r2=1096321&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PropertyTable.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/details/PropertyTable.java Sun Apr 24 12:47:48 2011
@@ -18,9 +18,13 @@
  */
 package org.apache.chemistry.opencmis.workbench.details;
 
+import java.awt.event.MouseEvent;
 import java.util.Collection;
 
 import org.apache.chemistry.opencmis.client.api.Property;
+import org.apache.chemistry.opencmis.commons.data.AllowableActions;
+import org.apache.chemistry.opencmis.commons.enums.Action;
+import org.apache.chemistry.opencmis.workbench.PropertyEditorFrame;
 import org.apache.chemistry.opencmis.workbench.model.ClientModel;
 
 public class PropertyTable extends AbstractDetailsTable {
@@ -35,6 +39,16 @@ public class PropertyTable extends Abstr
         init(model, COLUMN_NAMES, COLUMN_WIDTHS);
     }
 
+    @Override
+    public void doubleClickAction(MouseEvent e, int rowIndex) {
+        AllowableActions aa = getObject().getAllowableActions();
+
+        if ((aa == null) || (aa.getAllowableActions() == null)
+                || aa.getAllowableActions().contains(Action.CAN_UPDATE_PROPERTIES)) {
+            new PropertyEditorFrame(getClientModel(), getObject());
+        }
+    }
+
     public int getDetailRowCount() {
         return getObject().getProperties().size();
     }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java?rev=1096321&r1=1096320&r2=1096321&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/model/ClientModel.java Sun Apr 24 12:47:48 2011
@@ -31,6 +31,7 @@ import java.util.Map;
 import javax.swing.event.EventListenerList;
 
 import org.apache.chemistry.opencmis.client.api.CmisObject;
+import org.apache.chemistry.opencmis.client.api.FileableCmisObject;
 import org.apache.chemistry.opencmis.client.api.Folder;
 import org.apache.chemistry.opencmis.client.api.ItemIterable;
 import org.apache.chemistry.opencmis.client.api.ObjectType;
@@ -140,7 +141,16 @@ public class ClientModel {
             }
 
             if (!(folderObject instanceof Folder)) {
-                throw new Exception("Not a folder!");
+                if (folderObject instanceof FileableCmisObject) {
+                    List<Folder> parents = ((FileableCmisObject) folderObject).getParents();
+                    if (parents != null && parents.size() > 0) {
+                        folderObject = parents.get(0);
+                    } else {
+                        throw new Exception("The object is not a folder and not in a folder!");
+                    }
+                } else {
+                    throw new Exception("The object is a relationship and not in a folder!");
+                }
             }
 
             List<CmisObject> children = new ArrayList<CmisObject>();

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/CollectionRenderer.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/CollectionRenderer.java?rev=1096321&r1=1096320&r2=1096321&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/CollectionRenderer.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/CollectionRenderer.java Sun Apr 24 12:47:48 2011
@@ -68,9 +68,9 @@ public class CollectionRenderer extends 
             } else {
                 sb.append(o.toString());
             }
-            sb.append("</span><br/>");
+            // sb.append("</span><br/>");
         }
-        sb.append("</html>");
+        // sb.append("</html>");
 
         super.setValue(sb.toString());
     }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/InfoPanel.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/InfoPanel.java?rev=1096321&r1=1096320&r2=1096321&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/InfoPanel.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/java/org/apache/chemistry/opencmis/workbench/swing/InfoPanel.java Sun Apr 24 12:47:48 2011
@@ -19,112 +19,214 @@
 package org.apache.chemistry.opencmis.workbench.swing;
 
 import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Desktop;
 import java.awt.FlowLayout;
 import java.awt.Font;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Insets;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.net.URI;
+import java.util.Collection;
 
 import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
 import javax.swing.JCheckBox;
 import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
+import javax.swing.SwingUtilities;
 import javax.swing.UIManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
 
-public abstract class InfoPanel extends JPanel {
-
-	private static final long serialVersionUID = 1L;
-
-	private JPanel gridPanel;
-	private GridBagConstraints gbc;
-	private Font boldFont;
-
-	protected void setupGUI() {
-		setLayout(new FlowLayout(FlowLayout.LEFT));
-		setBackground(Color.WHITE);
-
-		gridPanel = new JPanel(new GridBagLayout());
-		gridPanel.setBackground(Color.WHITE);
-		add(gridPanel);
-
-		gbc = new GridBagConstraints();
-
-		gbc.fill = GridBagConstraints.BOTH;
-		gbc.gridy = 0;
-		gbc.insets = new Insets(3, 3, 3, 3);
-
-		Font labelFont = UIManager.getFont("Label.font");
-		boldFont = labelFont
-				.deriveFont(Font.BOLD, labelFont.getSize2D() * 1.2f);
-	}
-
-	protected JTextField addLine(String label) {
-		return addLine(label, false);
-	}
-
-	protected JTextField addLine(String label, boolean bold) {
-		JTextField textField = new JTextField();
-		textField.setEditable(false);
-		textField.setBorder(BorderFactory.createEmptyBorder());
-		if (bold) {
-			textField.setFont(boldFont);
-		}
-
-		JLabel textLable = new JLabel(label);
-		textLable.setLabelFor(textField);
-		if (bold) {
-			textLable.setFont(boldFont);
-		}
-
-		gbc.gridy++;
+import org.apache.chemistry.opencmis.workbench.ClientHelper;
 
-		gbc.gridx = 0;
-		gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
-		gridPanel.add(textLable, gbc);
-
-		gbc.gridx = 1;
-		gbc.anchor = GridBagConstraints.BASELINE_LEADING;
-		gridPanel.add(textField, gbc);
-
-		return textField;
-	}
-
-	protected JCheckBox addCheckBox(String label) {
-		JCheckBox checkBox = new JCheckBox();
-		checkBox.setEnabled(false);
-
-		JLabel textLable = new JLabel(label);
-		textLable.setLabelFor(checkBox);
-
-		gbc.gridy++;
-
-		gbc.gridx = 0;
-		gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
-		gridPanel.add(textLable, gbc);
-
-		gbc.gridx = 1;
-		gbc.anchor = GridBagConstraints.BASELINE_LEADING;
-		gridPanel.add(checkBox, gbc);
-
-		return checkBox;
-	}
-
-	protected <T extends JComponent> T addComponent(String label, T comp) {
-		JLabel textLable = new JLabel(label);
-		textLable.setLabelFor(comp);
-
-		gbc.gridy++;
-
-		gbc.gridx = 0;
-		gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
-		gridPanel.add(textLable, gbc);
+public abstract class InfoPanel extends JPanel {
 
-		gbc.gridx = 1;
-		gbc.anchor = GridBagConstraints.BASELINE_LEADING;
-		gridPanel.add(comp, gbc);
+    private static final long serialVersionUID = 1L;
 
-		return comp;
-	}
+    private JPanel gridPanel;
+    private GridBagConstraints gbc;
+    private Font boldFont;
+
+    protected void setupGUI() {
+        setLayout(new FlowLayout(FlowLayout.LEFT));
+        setBackground(Color.WHITE);
+
+        gridPanel = new JPanel(new GridBagLayout());
+        gridPanel.setBackground(Color.WHITE);
+        add(gridPanel);
+
+        gbc = new GridBagConstraints();
+
+        gbc.fill = GridBagConstraints.BOTH;
+        gbc.gridy = 0;
+        gbc.insets = new Insets(3, 3, 3, 3);
+
+        Font labelFont = UIManager.getFont("Label.font");
+        boldFont = labelFont.deriveFont(Font.BOLD, labelFont.getSize2D() * 1.2f);
+    }
+
+    protected JTextField addLine(final String label) {
+        return addLine(label, false);
+    }
+
+    protected JTextField addLine(final String label, final boolean bold) {
+        JTextField textField = new JTextField();
+        textField.setEditable(false);
+        textField.setBorder(BorderFactory.createEmptyBorder());
+        if (bold) {
+            textField.setFont(boldFont);
+        }
+
+        JLabel textLable = new JLabel(label);
+        textLable.setLabelFor(textField);
+        if (bold) {
+            textLable.setFont(boldFont);
+        }
+
+        gbc.gridy++;
+
+        gbc.gridx = 0;
+        gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
+        gridPanel.add(textLable, gbc);
+
+        gbc.gridx = 1;
+        gbc.anchor = GridBagConstraints.BASELINE_LEADING;
+        gridPanel.add(textField, gbc);
+
+        return textField;
+    }
+
+    protected JTextField addLink(final String label) {
+        final JTextField textField = addLine(label, false);
+
+        if (Desktop.isDesktopSupported()) {
+            textField.getDocument().addDocumentListener(new DocumentListener() {
+                @Override
+                public void removeUpdate(DocumentEvent e) {
+
+                }
+
+                @Override
+                public void insertUpdate(DocumentEvent e) {
+                    String uri = textField.getText().toLowerCase();
+                    if (uri.startsWith("http://") || uri.startsWith("https://")) {
+                        textField.setForeground(Color.BLUE);
+                        textField.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+                    } else {
+                        textField.setForeground(UIManager.getColor("textForeground"));
+                        textField.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+                    }
+                }
+
+                @Override
+                public void changedUpdate(DocumentEvent e) {
+                }
+            });
+
+            textField.addMouseListener(new MouseListener() {
+                @Override
+                public void mouseReleased(MouseEvent e) {
+                }
+
+                @Override
+                public void mousePressed(MouseEvent e) {
+                }
+
+                @Override
+                public void mouseExited(MouseEvent e) {
+                }
+
+                @Override
+                public void mouseEntered(MouseEvent e) {
+                }
+
+                @Override
+                public void mouseClicked(MouseEvent e) {
+                    if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 1) {
+                        String uri = textField.getText().toLowerCase();
+                        if (uri.startsWith("http://") || uri.startsWith("https://")) {
+                            try {
+                                Desktop.getDesktop().browse(new URI(textField.getText()));
+                            } catch (Exception ex) {
+                                ClientHelper.showError(InfoPanel.this, ex);
+                            }
+                        }
+                    }
+                }
+            });
+        }
+
+        return textField;
+    }
+
+    protected JCheckBox addCheckBox(String label) {
+        JCheckBox checkBox = new JCheckBox();
+        checkBox.setEnabled(false);
+
+        JLabel textLable = new JLabel(label);
+        textLable.setLabelFor(checkBox);
+
+        gbc.gridy++;
+
+        gbc.gridx = 0;
+        gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
+        gridPanel.add(textLable, gbc);
+
+        gbc.gridx = 1;
+        gbc.anchor = GridBagConstraints.BASELINE_LEADING;
+        gridPanel.add(checkBox, gbc);
+
+        return checkBox;
+    }
+
+    protected <T extends JComponent> T addComponent(String label, T comp) {
+        JLabel textLable = new JLabel(label);
+        textLable.setLabelFor(comp);
+
+        gbc.gridy++;
+
+        gbc.gridx = 0;
+        gbc.anchor = GridBagConstraints.BASELINE_TRAILING;
+        gridPanel.add(textLable, gbc);
+
+        gbc.gridx = 1;
+        gbc.anchor = GridBagConstraints.BASELINE_LEADING;
+        gridPanel.add(comp, gbc);
+
+        return comp;
+    }
+
+    public static class InfoList extends JPanel {
+        private static final long serialVersionUID = 1L;
+
+        public InfoList() {
+            setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+            setBackground(Color.WHITE);
+        }
+
+        public void clear() {
+            removeAll();
+        }
+
+        public void setList(Collection<?> list) {
+            clear();
+
+            if (list == null || list.size() == 0) {
+                return;
+            }
+
+            for (Object o : list) {
+                JTextField textField = new JTextField(o == null ? "" : o.toString());
+                textField.setEditable(false);
+                textField.setBorder(BorderFactory.createEmptyBorder(0, 0, 2, 0));
+                add(textField);
+            }
+        }
+    }
 }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/META-INF/README
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/META-INF/README?rev=1096321&r1=1096320&r2=1096321&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/META-INF/README (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/META-INF/README Sun Apr 24 12:47:48 2011
@@ -1,7 +1,7 @@
 CMIS Workbench
 
 This is a simple Content Management Interoperability Services (CMIS) client based on Swing and 
-Apache Chemistry OpenCMIS (http://incubator.apache.org/chemistry/opencmis.html).
+Apache Chemistry OpenCMIS (http://chemistry.apache.org/java/opencmis.html).
 
 This CMIS client is distributed under the Apache License, version 2.0.
 Please see the NOTICE and LICENSE files for details.

Added: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/add.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/add.png?rev=1096321&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/add.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/down.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/down.png?rev=1096321&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/down.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/remove.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/remove.png?rev=1096321&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/remove.png
------------------------------------------------------------------------------
    svn:mime-type = image/png

Added: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/up.png
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/up.png?rev=1096321&view=auto
==============================================================================
Binary file - no diff available.

Propchange: chemistry/opencmis/trunk/chemistry-opencmis-workbench/chemistry-opencmis-workbench/src/main/resources/images/up.png
------------------------------------------------------------------------------
    svn:mime-type = image/png