[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);
+}