[273068] XSD Editor navigation history errors
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/RedefineCategoryAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/RedefineCategoryAdapter.java
index cfb39e1..83e8c92 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/RedefineCategoryAdapter.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/RedefineCategoryAdapter.java
@@ -28,12 +28,14 @@
 public class RedefineCategoryAdapter extends CategoryAdapter
 {
   protected XSDRedefine xsdRedefine;
+  private XSDRedefineAdapter xsdRedefineAdapter;
 
-  public RedefineCategoryAdapter(String label, Image image, Collection children, XSDRedefine xsdRedefine, int groupType)
+  public RedefineCategoryAdapter(String label, Image image, Collection children, XSDRedefine xsdRedefine, XSDRedefineAdapter xsdRedefineAdapter, int groupType)
   {
     super(label, image, children, xsdRedefine.getSchema(), groupType);
     this.xsdRedefine = xsdRedefine;
     this.target = xsdRedefine;
+    this.xsdRedefineAdapter = xsdRedefineAdapter;
   }
 
   public XSDRedefine getXSDRedefine()
@@ -74,4 +76,10 @@
   {
     return (IModel)XSDAdapterFactory.getInstance().adapt(xsdRedefine.getSchema());
   }
+
+
+  public XSDRedefineAdapter getXsdRedefineAdapter() {
+	return xsdRedefineAdapter;
+  }
+  
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/XSDRedefineAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/XSDRedefineAdapter.java
index 59aa9dc..fc5285c 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/XSDRedefineAdapter.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/adapters/XSDRedefineAdapter.java
@@ -110,19 +110,19 @@
     XSDEditorPlugin xsdEditorPlugin = XSDEditorPlugin.getDefault();
     attributesCategory = new RedefineCategoryAdapter(
       Messages._UI_GRAPH_REDEFINE_ATTRIBUTE_GROUPS,
-      xsdEditorPlugin.getIconImage("obj16/attributesheader"), attributes, xsdRedefine, CategoryAdapter.ATTRIBUTES); //$NON-NLS-1$
+      xsdEditorPlugin.getIconImage("obj16/attributesheader"), attributes, xsdRedefine, this, CategoryAdapter.ATTRIBUTES); //$NON-NLS-1$
     attributesCategory.setAllChildren(attributes);
     registerListener(attributesCategory);
 
     typesCategory = new RedefineCategoryAdapter(
       Messages._UI_GRAPH_REDEFINE_TYPES,
-      xsdEditorPlugin.getIconImage("obj16/typesheader"), types, xsdRedefine, CategoryAdapter.TYPES); //$NON-NLS-1$
+      xsdEditorPlugin.getIconImage("obj16/typesheader"), types, xsdRedefine, this, CategoryAdapter.TYPES); //$NON-NLS-1$
     typesCategory.setAllChildren(types);
     registerListener(typesCategory);
 
     groupsCategory = new RedefineCategoryAdapter(
       Messages._UI_GRAPH_REDEFINE_GROUPS,
-      xsdEditorPlugin.getIconImage("obj16/groupsheader"), groups, xsdRedefine, CategoryAdapter.GROUPS); //$NON-NLS-1$
+      xsdEditorPlugin.getIconImage("obj16/groupsheader"), groups, xsdRedefine, this, CategoryAdapter.GROUPS); //$NON-NLS-1$
     groupsCategory.setAllChildren(groups);
     registerListener(groupsCategory);
   }
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/navigation/DesignViewNavigationLocation.java b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/navigation/DesignViewNavigationLocation.java
index 3e91502..6f256a1 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/navigation/DesignViewNavigationLocation.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-adt-xsd/org/eclipse/wst/xsd/ui/internal/navigation/DesignViewNavigationLocation.java
@@ -245,7 +245,7 @@
     	else if (component instanceof XSDRedefine)
     	{
     		XSDRedefine redefine = (XSDRedefine) component;
-    		pathSegment = new PathSegment(PathSegment.REDEFINE, redefine.toString());
+    		pathSegment = new PathSegment(PathSegment.REDEFINE, redefine.getSchemaLocation());
     	}
     	return pathSegment;
     }
@@ -361,7 +361,16 @@
         }
         else if (segment.kind == PathSegment.REDEFINE)
         {
-           // TODO
+        	Iterator iterator = schema.getContents().iterator();
+        	while (iterator.hasNext())
+        	{
+        		Object object = iterator.next();
+        		if (object instanceof XSDRedefine)
+        		{        			
+        			XSDRedefine redefine = (XSDRedefine)object;
+        			visitRedefine(redefine);
+        		}
+        	}
         }
       }
     }
@@ -438,14 +447,14 @@
     {
     	if (segment != null)
     	{
-    		String name = redefine.toString();
-    		if (segment.kind == PathSegment.ATTRIBUTE_GROUP && isMatch(segment.name, name))
+    		String name = redefine.getSchemaLocation();
+    		if (segment.kind == PathSegment.REDEFINE && isMatch(segment.name, name))
     		{
     			result = redefine;
     			incrementSegment();
     			if (!isDone())
     			{
-    				super.visitRedefine(redefine);
+    				visitSchema(redefine.getSchema());
     			}
     		}
     	}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/design/DesignViewGraphicalViewer.java b/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/design/DesignViewGraphicalViewer.java
index ff105ef..381415c 100644
--- a/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/design/DesignViewGraphicalViewer.java
+++ b/bundles/org.eclipse.wst.xsd.ui/src-adt/org/eclipse/wst/xsd/ui/internal/adt/design/DesignViewGraphicalViewer.java
@@ -13,6 +13,7 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
 import org.eclipse.jface.viewers.ISelection;
@@ -22,7 +23,13 @@
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.INavigationHistory;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.xsd.ui.internal.adapters.RedefineCategoryAdapter;
+import org.eclipse.wst.xsd.ui.internal.adapters.XSDRedefineAdapter;
 import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.IHolderEditPart;
 import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.RootContentEditPart;
 import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.StructureEditPart;
@@ -61,8 +68,12 @@
   // (e.g. a selection occured from another view)
   public void selectionChanged(SelectionChangedEvent event)
   {
-    Object selectedObject = ((StructuredSelection) event.getSelection()).getFirstElement();
-    
+    Object selectedObject = null;
+    ISelection eventSelection = event.getSelection();
+    if (eventSelection instanceof StructuredSelection)
+    {
+    	selectedObject = ((StructuredSelection) eventSelection).getFirstElement(); 
+    }    
     // TODO (cs) It seems like there's way more selection going on than there
     // should
     // be!! There's at least 2 selections getting fired when something is
@@ -70,6 +81,8 @@
     // outline view. Are we listening to too many things?
     //
     // if (event.getSource() instanceof ADTContentOutlinePage)
+    if (selectedObject != null)
+    {
     if (event.getSource() != internalSelectionProvider)
     {
       if (selectedObject instanceof IStructure)
@@ -79,11 +92,7 @@
         {
           if ((selectedObject instanceof IGraphElement) && ((IGraphElement)selectedObject).isFocusAllowed()) 
           {
-            if (event.getSource() instanceof org.eclipse.jface.viewers.IPostSelectionProvider)
-            {
-              setInput((IStructure)selectedObject);
-            }
-            else
+            if (!(event.getSource() instanceof org.eclipse.jface.viewers.IPostSelectionProvider))            
             {
               setInputAndMarkLocation((IStructure)selectedObject);
             }
@@ -96,11 +105,6 @@
         {
           setInputAndMarkLocation((IADTObject)selectedObject);              
         }
-        else if (((IGraphElement)selectedObject).isFocusAllowed() 
-            && (event.getSource() instanceof org.eclipse.jface.viewers.IPostSelectionProvider && !(getInput() instanceof IModel)))
-        {
-          setInput((IADTObject)selectedObject);
-        }
         else if (!((IGraphElement)selectedObject).isFocusAllowed())
         {
           // We encountered an object that is not a valid input to the graph viewer
@@ -168,8 +172,14 @@
       }
       else if (selectedObject instanceof IModelProxy)
       {
-        IModelProxy adapter = (IModelProxy)selectedObject;
-        if (getInput() != adapter.getModel())
+        IModelProxy adapter = (IModelProxy)selectedObject;        
+        if (selectedObject instanceof RedefineCategoryAdapter)
+        {
+        	RedefineCategoryAdapter selectionAdapter = (RedefineCategoryAdapter)selectedObject;
+        	XSDRedefineAdapter selectionParentAdapter = selectionAdapter.getXsdRedefineAdapter(); 
+        	setInputAndMarkLocation(selectionParentAdapter);
+        }
+        else if (getInput() != adapter.getModel())
            setInput(adapter.getModel());
       }
       else if (selectedObject instanceof IModel)
@@ -185,6 +195,7 @@
         setFocus(editPart);
       }
     }
+    }
   }
   
   /*
@@ -335,16 +346,27 @@
   
   public void setInputAndMarkLocation(IADTObject object)
   {
-    IADTObject oldInput = getInput();    
-    if (editorPart != null && oldInput != object)
-    {          
-      PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getNavigationHistory().markLocation(editorPart);
-    }  
+    IADTObject oldInput = getInput();
+    INavigationHistory navigationHistory = null;
+    IWorkbench workbench = PlatformUI.getWorkbench();
+    if(workbench != null)
+    {
+    	IWorkbenchWindow activeWorkbenchWindow = workbench.getActiveWorkbenchWindow();
+    	if(activeWorkbenchWindow != null)
+    	{
+    		IWorkbenchPage activePage = activeWorkbenchWindow.getActivePage();
+    		if(activePage != null)
+    		{
+    			navigationHistory = activePage.getNavigationHistory();
+    		}
+    	}
+    }
+
     setInput(object);
 
     if (editorPart != null && oldInput != object)
     {
-      PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getNavigationHistory().markLocation(editorPart);
+      navigationHistory.markLocation(editorPart);
     }
   }