[141066]  make extensions property sheet work properly
diff --git a/bundles/org.eclipse.wst.xsd.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.xsd.ui/META-INF/MANIFEST.MF
index 10fcc2c..db0e8a7 100644
--- a/bundles/org.eclipse.wst.xsd.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.xsd.ui/META-INF/MANIFEST.MF
@@ -28,6 +28,7 @@
  org.eclipse.wst.xsd.ui.internal.common.properties.providers,
  org.eclipse.wst.xsd.ui.internal.common.properties.sections,
  org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo,
+ org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom,
  org.eclipse.wst.xsd.ui.internal.common.util,
  org.eclipse.wst.xsd.ui.internal.design.editparts,
  org.eclipse.wst.xsd.ui.internal.design.editparts.model,
@@ -36,8 +37,8 @@
  org.eclipse.wst.xsd.ui.internal.design.layouts,
  org.eclipse.wst.xsd.ui.internal.dialogs,
  org.eclipse.wst.xsd.ui.internal.editor,
- org.eclipse.wst.xsd.ui.internal.editor.search,
  org.eclipse.wst.xsd.ui.internal.editor.icons,
+ org.eclipse.wst.xsd.ui.internal.editor.search,
  org.eclipse.wst.xsd.ui.internal.navigation,
  org.eclipse.wst.xsd.ui.internal.nsedit;x-internal:=true,
  org.eclipse.wst.xsd.ui.internal.preferences,
diff --git a/bundles/org.eclipse.wst.xsd.ui/plugin.properties b/bundles/org.eclipse.wst.xsd.ui/plugin.properties
index 75c9481..def1dc7 100644
--- a/bundles/org.eclipse.wst.xsd.ui/plugin.properties
+++ b/bundles/org.eclipse.wst.xsd.ui/plugin.properties
@@ -839,4 +839,7 @@
 
 Bundle-Vendor.0 = Eclipse.org
 search.declarations.label = Declarations
-search.references.label = References
\ No newline at end of file
+search.references.label = References
+
+! extension points 
+ExtensionNodeCustomizationsDescription = Extension Node Customizations
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/plugin.xml b/bundles/org.eclipse.wst.xsd.ui/plugin.xml
index f9e475f..e37f41f 100644
--- a/bundles/org.eclipse.wst.xsd.ui/plugin.xml
+++ b/bundles/org.eclipse.wst.xsd.ui/plugin.xml
@@ -223,6 +223,9 @@
   <extension-point id="ExtensionsSchemasDescription" name="%ExtensionsSchemasDescription"/>
 
   <extension-point id="XSDEditorExtensionConfiguration" name="%XSDEditorExtensionConfiguration"/>
+  
+  <extension-point id="extensibilityNodeCustomizations" name="%ExtensionNodeCustomizationsDescription"/>
+  
 
 	<extension
 		point="org.eclipse.wst.xml.core.catalogContributions">
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/editor/XSDEditorPlugin.java b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/editor/XSDEditorPlugin.java
index 4199d45..d65595a 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/editor/XSDEditorPlugin.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/editor/XSDEditorPlugin.java
@@ -14,6 +14,7 @@
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.plugin.*;
 import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.ExtensionsSchemasRegistry;
+import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom.NodeCustomizationRegistry;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
 import org.eclipse.jface.preference.IPreferenceStore;
@@ -40,7 +41,8 @@
 	private static XSDEditorPlugin plugin;
 	//Resource bundle.
 	private ResourceBundle resourceBundle;
-  private ExtensionsSchemasRegistry registry;
+  private ExtensionsSchemasRegistry registry;  
+  private NodeCustomizationRegistry propertyEditorRegistry;
   private XSDEditorConfiguration xsdEditorConfiguration = null;
   
   public static final String CONST_USE_SIMPLE_EDIT_MODE = PLUGIN_ID + ".useSimpleEditMode"; //$NON-NLS-1$
@@ -251,6 +253,7 @@
     return registry;
   }
 
+ 
   public XSDEditorConfiguration getXSDEditorConfiguration()
   {
     if (xsdEditorConfiguration == null)
@@ -319,4 +322,13 @@
   public String getDefaultPage() {
     return getPreferenceStore().getString(DEFAULT_PAGE);
   }
+
+  public NodeCustomizationRegistry getPropertyEditorRegistry()
+  {
+    if (propertyEditorRegistry == null)
+    {  
+      propertyEditorRegistry = new NodeCustomizationRegistry("foo");
+    }
+    return propertyEditorRegistry;
+  }
 }
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/AbstractExtensionsSection.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/AbstractExtensionsSection.java
index f2e36a9..5f029ae 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/AbstractExtensionsSection.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/AbstractExtensionsSection.java
@@ -44,7 +44,6 @@
 import org.eclipse.wst.xsd.ui.internal.common.commands.AddExtensionCommand;
 import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.AddExtensionsComponentDialog;
 import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.DOMExtensionDetailsContentProvider;
-import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.DOMExtensionItemEditManager;
 import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.DOMExtensionItemMenuListener;
 import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.ExtensionDetailsViewer;
 import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.ExtensionsSchemasRegistry;
@@ -319,7 +318,6 @@
   protected void createElementContentWidget(Composite parent)
   {
     extensionDetailsViewer = new ExtensionDetailsViewer(parent, getWidgetFactory());
-    extensionDetailsViewer.setEditManager(new DOMExtensionItemEditManager());
     extensionDetailsViewer.setContentProvider(new DOMExtensionDetailsContentProvider());    
     extensionDetailsViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
   }
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionDetailsContentProvider.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionDetailsContentProvider.java
index d6753b4..56cc7c0 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionDetailsContentProvider.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionDetailsContentProvider.java
@@ -2,38 +2,44 @@
 
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
 import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
 import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
 import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
+import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom.DefaultListNodeEditorConfiguration;
+import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom.NodeCustomizationRegistry;
+import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom.NodeEditorConfiguration;
+import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom.NodeEditorProvider;
+import org.eclipse.wst.xsd.ui.internal.editor.XSDEditorPlugin;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 
-
 public class DOMExtensionDetailsContentProvider implements ExtensionDetailsContentProvider
 {
   private static Object[] EMPTY_ARRAY = {};
-  private static String[] EMPTY_STRING_ARRAY = {};  
+  private static String[] EMPTY_STRING_ARRAY = {};
+
   public Object[] getItems(Object input)
-  {  
+  {
     HashMap resultMap = new HashMap();
     if (input instanceof Element)
-    {  
-      Element element = (Element)input;
+    {
+      Element element = (Element) input;
       NamedNodeMap attributes = element.getAttributes();
       for (int i = 0; i < attributes.getLength(); i++)
       {
-        Attr attr = (Attr)attributes.item(i);    
+        Attr attr = (Attr) attributes.item(i);
         if (!"xmlns".equals(attr.getName()) && !"xmlns".equals(attr.getPrefix())) //$NON-NLS-1$ //$NON-NLS-2$
-        {    
+        {
           resultMap.put(attr.getName(), new DOMExtensionItem(attr));
         }
-      }  
+      }
       ModelQuery modelQuery = ModelQueryUtil.getModelQuery(element.getOwnerDocument());
       if (modelQuery != null)
-      {  
+      {
         CMElementDeclaration ed = modelQuery.getCMElementDeclaration(element);
         if (ed != null)
         {
@@ -41,47 +47,51 @@
           if (attrMap != null)
           {
             int attrMapLength = attrMap.getLength();
-            for (int i = 0; i < attrMapLength; i++) 
+            for (int i = 0; i < attrMapLength; i++)
             {
               CMAttributeDeclaration ad = (CMAttributeDeclaration) attrMap.item(i);
               if (resultMap.get(ad.getNodeName()) == null)
-              {  
+              {
                 resultMap.put(ad.getNodeName(), new DOMExtensionItem(element, ad));
-              }  
-            }  
+              }
+            }
           }
           //
-          int contentType = ed.getContentType(); 
-          if ((contentType == CMElementDeclaration.PCDATA || 
-              contentType == CMElementDeclaration.PCDATA) &&
-              ed.getDataType() != null)              
+          int contentType = ed.getContentType();
+          if ((contentType == CMElementDeclaration.PCDATA || contentType == CMElementDeclaration.PCDATA) && ed.getDataType() != null)
           {
             resultMap.put("text()", new DOMExtensionItem(element, ed)); //$NON-NLS-1$
-          }  
+          }
         }
-      }      
+      }
       Collection collection = resultMap.values();
+      // initialize the editor information for each item
+      //
+      for (Iterator i = collection.iterator(); i.hasNext();)
+      {
+        initPropertyEditorConfiguration((DOMExtensionItem) i.next());
+      }
       DOMExtensionItem[] items = new DOMExtensionItem[collection.size()];
       resultMap.values().toArray(items);
-      return items;      
+      return items;
     }
     else if (input instanceof Attr)
     {
-      Attr attr = (Attr)input;
+      // TODO (cs) do we actually utilize this case?
+      Attr attr = (Attr) input;
       DOMExtensionItem item = new DOMExtensionItem(attr);
       DOMExtensionItem[] items = {item};
       return items;
-    }  
+    }
     return EMPTY_ARRAY;
   }
-  
 
   public String getName(Object item)
   {
     if (item instanceof DOMExtensionItem)
     {
-      return ((DOMExtensionItem)item).getName();
-    }  
+      return ((DOMExtensionItem) item).getName();
+    }
     return ""; //$NON-NLS-1$
   }
 
@@ -89,17 +99,46 @@
   {
     if (item instanceof DOMExtensionItem)
     {
-      return ((DOMExtensionItem)item).getValue();
-    }  
+      return ((DOMExtensionItem) item).getValue();
+    }
     return ""; //$NON-NLS-1$
   }
-  
+
   public String[] getPossibleValues(Object item)
   {
     if (item instanceof DOMExtensionItem)
     {
-      return ((DOMExtensionItem)item).getPossibleValues();
-    }  
-    return EMPTY_STRING_ARRAY;    
+      return ((DOMExtensionItem) item).getPossibleValues();
+    }
+    return EMPTY_STRING_ARRAY;
+  }
+
+  protected void initPropertyEditorConfiguration(DOMExtensionItem item)
+  {
+    String namespace = item.getNamespace();
+    String name = item.getName();
+    String parentName = item.getParentName();
+    NodeEditorConfiguration configuration = null;
+    if (namespace != null)
+    {
+      // TODO (cs) remove reference to XSDEditorPlugin... make generic
+      // perhaps push down the xml.ui ?
+      //
+      NodeCustomizationRegistry registry = XSDEditorPlugin.getDefault().getPropertyEditorRegistry();
+      NodeEditorProvider provider= registry.getNodeEditorProvider(namespace);      
+      if (provider != null)
+      {
+        configuration = provider.getNodeEditorConfiguration(parentName, name);    
+      }
+    }
+    String[] values = item.getPossibleValues();
+    if (values != null && values.length > 1)
+    {
+      configuration = new DefaultListNodeEditorConfiguration(values);
+    }
+    
+    // Note that it IS expected that the configaration may be null
+    //
+    item.setPropertyEditorConfiguration(configuration);
   }
 }
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionItem.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionItem.java
index 2a269f5..0b390bc 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionItem.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionItem.java
@@ -12,45 +12,45 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
-class DOMExtensionItem
-{     
+class DOMExtensionItem extends ExtensionItem
+{
   Node node;
   Element parent;
   CMNode cmNode;
-  
+
   DOMExtensionItem(Node node)
   {
     this.node = node;
   }
-  
+
   DOMExtensionItem(Element parent, CMElementDeclaration ed)
   {
     this.parent = parent;
     this.cmNode = ed;
-  }   
-  
+  }
+
   DOMExtensionItem(Element parent, CMAttributeDeclaration ad)
   {
     this.parent = parent;
     this.cmNode = ad;
-  }   
-  
+  }
+
   public String getName()
   {
     if (node instanceof Attr)
     {
-      Attr attr = (Attr)node;
+      Attr attr = (Attr) node;
       return attr.getName();
-    }  
+    }
     else if (cmNode instanceof CMAttributeDeclaration)
     {
-      CMAttributeDeclaration ad = (CMAttributeDeclaration)cmNode;
-      return ad.getNodeName() + "*"; //$NON-NLS-1$
-    }  
+      CMAttributeDeclaration ad = (CMAttributeDeclaration) cmNode;
+      return ad.getNodeName();// + "*"; //$NON-NLS-1$
+    }
     else if (cmNode instanceof CMDataType)
     {
       return "text()"; //$NON-NLS-1$
-    }      
+    }
     return ""; //$NON-NLS-1$
   }
 
@@ -58,70 +58,97 @@
   {
     if (node instanceof Attr)
     {
-      Attr attr = (Attr)node;
+      Attr attr = (Attr) node;
       return attr.getValue();
-    }  
+    }
     return ""; //$NON-NLS-1$
   }
-  
+
   public String[] getPossibleValues()
   {
     String[] result = {};
     if (node instanceof Attr)
-    {  
-      Attr attr = (Attr)node;
+    {
+      Attr attr = (Attr) node;
       ModelQuery modelQuery = ModelQueryUtil.getModelQuery(attr.getOwnerDocument());
       if (modelQuery != null)
       {
         CMAttributeDeclaration ad = modelQuery.getCMAttributeDeclaration(attr);
         if (ad != null)
-        {  
+        {
           result = modelQuery.getPossibleDataTypeValues(attr.getOwnerElement(), ad);
-        }  
-      }  
+        }
+      }
     }
     else if (parent != null)
-    {  
+    {
       if (cmNode == null || cmNode instanceof CMDataType)
       {
         // TODO
         //        
-      }  
+      }
       else if (cmNode instanceof CMAttributeDeclaration)
       {
-        CMAttributeDeclaration ad = (CMAttributeDeclaration)cmNode;
+        CMAttributeDeclaration ad = (CMAttributeDeclaration) cmNode;
         ModelQuery modelQuery = ModelQueryUtil.getModelQuery(parent.getOwnerDocument());
         if (modelQuery != null)
         {
-           result = modelQuery.getPossibleDataTypeValues(parent, ad);
-        }       
-      }    
-    }          
+          result = modelQuery.getPossibleDataTypeValues(parent, ad);
+        }
+      }
+    }
     return result;
   }
-  
+
   public Command getUpdateValueCommand(String newValue)
   {
     if (node instanceof Attr)
-    {  
-      Attr attr = (Attr)node;
+    {
+      Attr attr = (Attr) node;
       return new UpdateAttributeValueCommand(attr.getOwnerElement(), attr.getNodeName(), newValue);
     }
     else if (parent != null)
-    {  
+    {
       if (cmNode == null || cmNode instanceof CMDataType)
       {
         // in this case we need to update the parent's text
         //        
-      }  
+      }
       else if (cmNode instanceof CMAttributeDeclaration)
       {
         // TODO (cs) add namespace prefix to attribute name if req'd
         //
-        CMAttributeDeclaration ad = (CMAttributeDeclaration)cmNode;
-        return new UpdateAttributeValueCommand(parent, ad.getAttrName(), newValue);       
-      }    
-    }      
-    return null;      
+        CMAttributeDeclaration ad = (CMAttributeDeclaration) cmNode;
+        return new UpdateAttributeValueCommand(parent, ad.getAttrName(), newValue);
+      }
+    }
+    return null;
+  }
+
+  public String getNamespace()
+  {
+    String namespace = null;
+    if (node != null)
+    {
+      if (node.getNodeType() == Node.ELEMENT_NODE)
+      {
+        namespace = node.getNamespaceURI();
+      }
+      else if (node.getNodeType() == Node.ATTRIBUTE_NODE)
+      {
+        Attr attr = (Attr) node;
+        namespace = attr.getOwnerElement().getNamespaceURI();
+      }
+    }
+    else if (parent != null)
+    {
+      namespace = parent.getNamespaceURI();
+    }
+    return namespace;
+  }
+  
+  public String getParentName()
+  {
+    return "";
   }
 }
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionItemEditManager.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionItemEditManager.java
index caca442..d069b8f 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionItemEditManager.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/DOMExtensionItemEditManager.java
@@ -1,46 +1,19 @@
 package org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo;
 
-import org.eclipse.gef.commands.Command;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
 import org.eclipse.swt.widgets.Widget;
 
+
+/**
+ * @deprecated
+ */
 public class DOMExtensionItemEditManager implements ExtensionItemEditManager
 {
   public void handleEdit(Object item, Widget widget)
-  {
-    if (item instanceof DOMExtensionItem)
-    {
-      DOMExtensionItem extensionItem = (DOMExtensionItem)item;
-      String value = null;
-      if (widget instanceof Text)
-      {
-        Text text = (Text)widget;
-        value = text.getText();    
-      }
-      else if (widget instanceof CCombo)
-      {
-        CCombo combo = (CCombo)widget;
-        int index = combo.getSelectionIndex();
-        if (index != -1)
-        {  
-          value = combo.getItem(index);
-        }  
-      }       
-      if (value != null)
-      {  
-        Command command = extensionItem.getUpdateValueCommand(value);
-        if (command != null)
-        {
-          // TODO (cs) add command stack handling stuff
-          command.execute();
-        }
-      }  
-    }
+  {   
   }
 
   public Control createCustomButtonControl(Composite composite, Object item)
@@ -57,24 +30,11 @@
 
   public String getButtonControlStyle(Object object)
   {
-    /*
-    DOMExtensionItem item = (DOMExtensionItem)object;
-    if (item.getName().startsWith("n"))
-    {  
-      return ExtensionItemEditManager.STYLE_CUSTOM;
-    }*/
     return ExtensionItemEditManager.STYLE_NONE;
   }
 
   public String getTextControlStyle(Object object)
   {
-    DOMExtensionItem item = (DOMExtensionItem)object;
-    String[] values = item.getPossibleValues();
-    
-    if (values != null && values.length > 1)
-    {
-      return ExtensionItemEditManager.STYLE_COMBO;      
-    } 
-    return ExtensionItemEditManager.STYLE_TEXT;
+    return ExtensionItemEditManager.STYLE_NONE;
   }
 }
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/ExtensionDetailsViewer.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/ExtensionDetailsViewer.java
index b317f2b..2064dad 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/ExtensionDetailsViewer.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/ExtensionDetailsViewer.java
@@ -1,7 +1,9 @@
 package org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo;
 
 import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.gef.commands.Command;
 import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CCombo;
@@ -9,11 +11,16 @@
 import org.eclipse.swt.events.FocusListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom.DialogNodeEditorConfiguration;
+import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom.ListNodeEditorConfiguration;
+import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom.NodeEditorConfiguration;
 
 public class ExtensionDetailsViewer extends Viewer
 {
@@ -23,7 +30,6 @@
   ExtensionDetailsContentProvider contentProvider;
   TabbedPropertySheetWidgetFactory widgetFactory;  
   InternalFocusListener internalFocusListener;
-  ExtensionItemEditManager editManager;
   
   public ExtensionDetailsViewer(Composite parent, TabbedPropertySheetWidgetFactory widgetFactory)
   {
@@ -56,13 +62,66 @@
     
   }
 
+  private void createTextOrComboControl(ExtensionItem item, Composite composite)
+  {
+    Control control = null;
+    String value = contentProvider.getValue(item);
+    NodeEditorConfiguration editorConfiguration = item.getPropertyEditorConfiguration();
+
+    if (editorConfiguration != null && hasStyle(editorConfiguration, NodeEditorConfiguration.STYLE_COMBO))
+    {          
+      ListNodeEditorConfiguration configuration = (ListNodeEditorConfiguration)editorConfiguration;
+      CCombo combo = widgetFactory.createCCombo(composite);
+      combo.setText(value);
+      Object[] values = configuration.getValues(item);
+      LabelProvider labelProvider = configuration.getLabelProvider();
+      for (int j = 0; j < values.length; j++)
+      {            
+        Object o = values[j];
+        String displayName = labelProvider != null ?
+            labelProvider.getText(o) :
+              o.toString();
+            combo.add(displayName);
+      }   
+      control = combo;
+    }
+    if (control == null)
+    {
+      Text text = widgetFactory.createText(composite,value);
+      control = text; 
+    } 
+    control.setData(ITEM_DATA, item);
+    control.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+    control.addFocusListener(internalFocusListener);      
+  }
+  
+  private void createButtonControl(ExtensionItem item, Composite composite)
+  {
+    NodeEditorConfiguration editorConfiguration = item.getPropertyEditorConfiguration();
+    if (editorConfiguration != null && hasStyle(editorConfiguration, NodeEditorConfiguration.STYLE_DIALOG))
+    {    
+      DialogNodeEditorConfiguration configuration = (DialogNodeEditorConfiguration)editorConfiguration;            
+      Button button = new Button(composite, SWT.NONE);
+      String text = configuration.getButonText();
+      if (text != null)
+      {  
+        button.setText(text); //$NON-NLS-1$
+      }  
+      button.setImage(configuration.getButtonImage());
+    }
+    else
+    {
+      Control placeHolder = new Label(composite, SWT.NONE);
+      placeHolder.setVisible(false);
+      placeHolder.setEnabled(false);
+      placeHolder.setLayoutData(new GridData()); 
+    }      
+  } 
+  
   public void setInput(Object input)
   { 
     // TODO (cs) add assertions
     //
-    if (editManager == null)
-      return;
-    
     if (contentProvider == null)
       return;
     
@@ -90,55 +149,22 @@
 
     for (int i = 0; i < items.length; i++)
     {
-      Object item = items[i];
+      ExtensionItem item = (ExtensionItem)items[i];
       String name = contentProvider.getName(item);
-      String value = contentProvider.getValue(item);
       Label label = widgetFactory.createLabel(composite, name + ":"); //$NON-NLS-1$
       label.setLayoutData(new GridData());
-      
-      Control control = null;
-      String style = editManager.getTextControlStyle(item);
-
-      if (style == ExtensionItemEditManager.STYLE_COMBO)
-      {
-        CCombo combo = widgetFactory.createCCombo(composite);
-        combo.setText(value);
-        String[] values = contentProvider.getPossibleValues(item);       
-        for (int j = 0; j < values.length; j++)
-        {  
-          combo.add(values[j]);
-        }   
-        control = combo;        
-      }     
-      else if (style == ExtensionItemEditManager.STYLE_CUSTOM)
-      {
-        control = editManager.createCustomTextControl(composite, item);
-      }  
-      else // (style == ExtensionItemEditManager.STYLE_TEXT)
-      {  
-        Text text = widgetFactory.createText(composite,value);
-        control = text;
-      }      
-      control.setData(ITEM_DATA, item);
-      control.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));      
-      control.addFocusListener(internalFocusListener);      
-      
-      String buttongStyle = editManager.getButtonControlStyle(item);
-      if (buttongStyle == ExtensionItemEditManager.STYLE_CUSTOM)
-      {
-        editManager.createCustomButtonControl(composite, item);
-      }
-      else
-      {
-        Control placeHolder = new Label(composite, SWT.NONE);
-        placeHolder.setVisible(false);
-        placeHolder.setEnabled(false);
-        placeHolder.setLayoutData(new GridData()); 
-      }  
+      createTextOrComboControl(item, composite);
+      createButtonControl(item, composite);
     }  
     control.layout(true);    
   }
-
+    
+  private boolean hasStyle(NodeEditorConfiguration configuration, int style)
+  {
+    return (configuration.getStyle() & style) != 0;
+  }
+  
+  
   public void setSelection(ISelection selection, boolean reveal)
   {
     // TODO Auto-generated method stub
@@ -153,6 +179,37 @@
     this.contentProvider = contentProvider;
   }
   
+  private void applyEdit(ExtensionItem item, Widget widget)
+  {
+    if (item != null)
+    {    
+      String value = null;
+      if (widget instanceof Text)
+      {
+        Text text = (Text)widget;
+        value = text.getText();    
+      }
+      else if (widget instanceof CCombo)
+      {
+        CCombo combo = (CCombo)widget;
+        int index = combo.getSelectionIndex();
+        if (index != -1)
+        {  
+          value = combo.getItem(index);
+        }  
+      }       
+      if (value != null)
+      {  
+        Command command = item.getUpdateValueCommand(value);
+        if (command != null)
+        {
+          // TODO (cs) add command stack handling stuff
+          command.execute();
+        }
+      }                    
+    }              
+  }
+  
   class InternalFocusListener implements FocusListener
   {
     public void focusGained(FocusEvent e)
@@ -161,23 +218,11 @@
     
     public void focusLost(FocusEvent e)
     {
-      if (editManager != null)
-      {  
-        Object item = e.widget.getData(ITEM_DATA);
-        if (item != null)
-        {
-          editManager.handleEdit(item, e.widget);
-        }          
-      }
+      Object item = e.widget.getData(ITEM_DATA);
+      if (item instanceof ExtensionItem)
+      {
+        applyEdit((ExtensionItem)item, e.widget);
+      }      
     }
   }
-
-  public ExtensionItemEditManager getEditManager()
-  {
-    return editManager;
-  }
-  public void setEditManager(ExtensionItemEditManager editManager)
-  {
-    this.editManager = editManager;
-  }
 }
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/ExtensionItem.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/ExtensionItem.java
new file mode 100644
index 0000000..2b4d880
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/ExtensionItem.java
@@ -0,0 +1,21 @@
+package org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom.NodeEditorConfiguration;
+
+public abstract class ExtensionItem
+{
+  NodeEditorConfiguration propertyEditorConfiguration;
+
+  public NodeEditorConfiguration getPropertyEditorConfiguration()
+  {
+    return propertyEditorConfiguration;
+  }
+
+  public void setPropertyEditorConfiguration(NodeEditorConfiguration propertyEditorConfiguration)
+  {
+    this.propertyEditorConfiguration = propertyEditorConfiguration;
+  }  
+  
+  public abstract Command getUpdateValueCommand(String newValue);
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/ExtensionItemEditManager.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/ExtensionItemEditManager.java
index aa1bacb..7c03187 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/ExtensionItemEditManager.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/ExtensionItemEditManager.java
@@ -3,11 +3,14 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Widget;
-
+ 
+/**
+ * @deprecated
+ */ 
 public interface ExtensionItemEditManager
-{
-  public final static String STYLE_NONE = "none";   //$NON-NLS-1$
-  public final static String STYLE_TEXT = "text"; //$NON-NLS-1$
+{  
+  public final static String STYLE_NONE = "none";   //$NON-NLS-1$  
+  public final static String STYLE_TEXT = "text"; //$NON-NLS-1$  
   public final static String STYLE_COMBO = "combo"; //$NON-NLS-1$
   public final static String STYLE_CUSTOM = "custom";     //$NON-NLS-1$
   
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/DefaultListNodeEditorConfiguration.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/DefaultListNodeEditorConfiguration.java
new file mode 100644
index 0000000..ce45be8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/DefaultListNodeEditorConfiguration.java
@@ -0,0 +1,17 @@
+package org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom;
+
+
+public class DefaultListNodeEditorConfiguration extends ListNodeEditorConfiguration
+{
+  private String[] values;
+  
+  public DefaultListNodeEditorConfiguration(String[] values)
+  {
+    this.values = values; 
+  }
+ 
+  public Object[] getValues(Object propertyObject)
+  {
+    return values;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/DialogNodeEditorConfiguration.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/DialogNodeEditorConfiguration.java
new file mode 100644
index 0000000..675c274
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/DialogNodeEditorConfiguration.java
@@ -0,0 +1,23 @@
+package org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom;
+
+import org.eclipse.swt.graphics.Image;
+
+public abstract class DialogNodeEditorConfiguration extends NodeEditorConfiguration
+{
+  public int getStyle()
+  {        
+    return STYLE_DIALOG;
+  }
+  
+  public String getButonText()
+  {
+    return null;
+  }
+  
+  public Image getButtonImage()
+  {
+    return null;
+  }
+  
+  public abstract void invokeDialog();
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/ListNodeEditorConfiguration.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/ListNodeEditorConfiguration.java
new file mode 100644
index 0000000..613396e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/ListNodeEditorConfiguration.java
@@ -0,0 +1,25 @@
+package org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom;
+
+import org.eclipse.jface.viewers.LabelProvider;
+
+public abstract class ListNodeEditorConfiguration extends NodeEditorConfiguration
+{
+  private LabelProvider labelProvider;
+ 
+  public LabelProvider getLabelProvider()
+  {
+    return labelProvider;
+  }
+  
+  public int getStyle()
+  {
+    return STYLE_COMBO;
+  }    
+
+  public void setLabelProvider(LabelProvider labelProvider)
+  {
+    this.labelProvider = labelProvider;
+  }
+
+  public abstract Object[] getValues(Object propertyObject);
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/NodeCustomizationRegistry.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/NodeCustomizationRegistry.java
new file mode 100644
index 0000000..2548a2c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/NodeCustomizationRegistry.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom;
+
+import java.util.HashMap;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+
+public class NodeCustomizationRegistry
+{
+  private static final String NAMESPACE = "namespace"; //$NON-NLS-1$  
+  //private static final String LABEL_PROVIDER_ATTRIBUTE_NAME = "labelProvider"; //$NON-NLS-1$    
+  private static final String NODE_EDITOR_PROVIDER_CLASS_ATTRIBUTE_NAME = "nodeEditorProviderClass"; //$NON-NLS-1$
+
+
+  protected String extensionId;
+  protected HashMap map;
+
+  public NodeCustomizationRegistry(String propertyEditorExtensionId)
+  {
+    extensionId = "org.eclipse.wst.xsd.ui.extensibilityNodeCustomizations";//propertyEditorExtensionId;
+  }  
+  
+  private class Descriptor
+  {
+    IConfigurationElement configurationElement;
+    
+    NodeEditorProvider nodeEditorProvider;
+    boolean nodeEditorProviderFailedToLoad = false;
+    
+    //LabelProvider labelProvider;
+    //boolean labelProviderFailedToLoad = false;
+    
+    Descriptor(IConfigurationElement element)
+    {
+      this.configurationElement = element;
+    }
+    
+    NodeEditorProvider lookupOrCreateNodeEditorProvider()
+    {
+      if (nodeEditorProvider == null && !nodeEditorProviderFailedToLoad)
+      {
+        try
+        {
+          nodeEditorProvider = (NodeEditorProvider)configurationElement.createExecutableExtension(NODE_EDITOR_PROVIDER_CLASS_ATTRIBUTE_NAME);
+        }
+        catch (Exception e) 
+        {
+          nodeEditorProviderFailedToLoad = true;
+        }
+      } 
+      return nodeEditorProvider;
+    }
+  }
+
+  
+  private HashMap initMap()
+  {
+    HashMap theMap = new HashMap();
+    IConfigurationElement[] extensions = Platform.getExtensionRegistry().getConfigurationElementsFor("org.eclipse.wst.xsd.ui.extensibilityNodeCustomizations");
+    for (int i = 0; i < extensions.length; i++)
+    {
+      IConfigurationElement configurationElement = extensions[i];
+      String namespace = configurationElement.getAttribute(NAMESPACE);
+      if (namespace != null)
+      {
+        theMap.put(namespace, new Descriptor(configurationElement));
+      }     
+    }    
+    return theMap;
+  }
+
+  public NodeEditorProvider getNodeEditorProvider(String namespace)
+  {     
+    map = null;
+    if (namespace != null)
+    { 
+      if (map == null)
+      {  
+        map = initMap();
+      }  
+      Descriptor descriptor = (Descriptor)map.get(namespace);
+      if (descriptor != null)
+      {  
+        return descriptor.lookupOrCreateNodeEditorProvider();    
+      }
+    }
+    return null;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/NodeEditorConfiguration.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/NodeEditorConfiguration.java
new file mode 100644
index 0000000..80fb314
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/NodeEditorConfiguration.java
@@ -0,0 +1,11 @@
+package org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom;
+
+public abstract class NodeEditorConfiguration
+{  
+  public final static int STYLE_NONE = 0;   
+  public final static int STYLE_TEXT = 1; 
+  public final static int STYLE_COMBO = 2;
+  public final static int STYLE_DIALOG = 4;   
+  
+  public abstract int getStyle();
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/NodeEditorProvider.java b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/NodeEditorProvider.java
new file mode 100644
index 0000000..f34bcfa
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src-common/org/eclipse/wst/xsd/ui/internal/common/properties/sections/appinfo/custom/NodeEditorProvider.java
@@ -0,0 +1,8 @@
+package org.eclipse.wst.xsd.ui.internal.common.properties.sections.appinfo.custom;
+
+
+public abstract class NodeEditorProvider
+{
+  public abstract NodeEditorConfiguration getNodeEditorConfiguration(String parentName, String nodeName); 
+  //public abstract NodeEditorConfiguration getNodeEditorConfiguration(Node node);   
+}