M3 plan to improve synchronization between source and graph
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditor.java
index 2235ff5..a161ed9 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditor.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditor.java
@@ -28,7 +28,6 @@
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
-//import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
@@ -55,7 +54,9 @@
import org.eclipse.wst.xml.core.document.XMLModel;
import org.eclipse.wst.xml.core.internal.document.XMLModelImpl;
import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphViewer;
+//import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
import org.eclipse.wst.xsd.ui.internal.util.OpenOnSelectionHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
import org.eclipse.xsd.XSDConcreteComponent;
import org.eclipse.xsd.XSDPackage;
import org.eclipse.xsd.XSDSchema;
@@ -500,11 +501,6 @@
public void notifyChanged(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index)
{
- if (eventType == INodeNotifier.REMOVE) // don't handle remove events
- {
- return;
- }
-
if (!handlingNotifyChanged)
{
handlingNotifyChanged = true;
@@ -515,7 +511,6 @@
!(getActivePart() instanceof PropertySheet) &&
!(getActivePart() instanceof org.eclipse.ui.views.contentoutline.ContentOutline)) {
startDelayedEvent(notifier, eventType, feature, oldValue, newValue, index);
- //handleNotifyChange(notifier, eventType, feature, oldValue, newValue, index);
}
else // all other views, just handle the events right away
{
@@ -544,12 +539,41 @@
}
break;
}
+ case INodeNotifier.REMOVE:
+ {
+ Node node = (Node)notifier;
+ XSDConcreteComponent listener = xsdSchema.getCorrespondingComponent(node);
+
+ if (listener instanceof XSDSchema)
+ {
+ // we want to reset the schema's external elements when the directive is deleted
+ if (feature instanceof Element)
+ {
+ Element elem = (Element)feature;
+ if (XSDDOMHelper.inputEquals(elem, XSDConstants.INCLUDE_ELEMENT_TAG, false) ||
+ XSDDOMHelper.inputEquals(elem, XSDConstants.IMPORT_ELEMENT_TAG, false) ||
+ XSDDOMHelper.inputEquals(elem, XSDConstants.REDEFINE_ELEMENT_TAG, false))
+ {
+ xsdSchema.reset();
+ xsdSchema.update();
+ }
+ }
+ }
+ }
case INodeNotifier.CHANGE:
{
Node node = (Node)notifier;
XSDConcreteComponent listener = xsdSchema.getCorrespondingComponent(node);
- listener.elementAttributesChanged((Element)node);
- listener.elementChanged((Element)node);
+ if (node.getNodeType() == Node.ELEMENT_NODE)
+ {
+ listener.elementAttributesChanged((Element)node);
+ listener.elementChanged((Element)node);
+ }
+ else if (node.getNodeType() == Node.DOCUMENT_NODE)
+ {
+ listener.elementAttributesChanged(((Document)node).getDocumentElement());
+ listener.elementChanged(((Document)node).getDocumentElement());
+ }
break;
}
case INodeNotifier.STRUCTURE_CHANGED:
@@ -557,7 +581,7 @@
{
Node node = (Node)notifier;
XSDConcreteComponent listener = xsdSchema.getCorrespondingComponent(node);
- if (node.getNodeType() == Node.ELEMENT_NODE)
+ if (node.getNodeType() == Node.ELEMENT_NODE)
{
listener.elementContentsChanged((Element)node);
break;
@@ -574,7 +598,7 @@
boolean doParse = false;
if (attr != null)
{
- if (attr.getValue().equals("http://www.w3.org/2001/XMLSchema") && docElement.getLocalName().equals("schema"))
+ if (attr.getValue().equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001) && docElement.getLocalName().equals("schema"))
{
// We have a viable schema so parse it
doParse = true;