[270478] [Editor] Cannot shift focus between items in the WSDL editor design view
diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingContentEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingContentEditPart.java
index 0eb56c2..092e83e 100644
--- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingContentEditPart.java
+++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingContentEditPart.java
@@ -19,8 +19,10 @@
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.Label;
 import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.PositionConstants;
 import org.eclipse.draw2d.ToolbarLayout;
 import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
 import org.eclipse.gef.EditPolicy;
 import org.eclipse.wst.wsdl.ui.internal.WSDLEditorPlugin;
 import org.eclipse.wst.wsdl.ui.internal.asd.design.DesignViewGraphicsConstants;
@@ -114,4 +116,14 @@
     }
     return accessibleName;
   }
+
+
+  public EditPart getRelativeEditPart(int direction) {
+	  EditPart editPart = super.getRelativeEditPart(direction);
+	  if (direction == PositionConstants.SOUTH && (editPart == null || editPart == this))
+	  {
+		  editPart = EditPartNavigationHandlerUtil.getNextSibling(getParent());           
+	  }       
+	  return editPart;
+  }
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingEditPart.java
index 03ff5f9..d87c92a 100644
--- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingEditPart.java
+++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/BindingEditPart.java
@@ -201,14 +201,30 @@
       }
       else
       {
-    	  return null;
+    	  // or to the first unconnected interface
+    	  return EditPartNavigationHandlerUtil.getFirstInterface(this);
       }
     }  
     else if (direction == PositionConstants.WEST)
     {
-      // navigate backward along the connection (to the left)
-      return EditPartNavigationHandlerUtil.getSourceConnectionEditPart(this);
-    }      
+      // navigate backward along the connection (to the left) or to the first unconnected service
+    	EditPart connectedService = EditPartNavigationHandlerUtil.getSourceConnectionEditPart(this);
+    	if (connectedService != null) {
+    		return connectedService;
+    	} else {
+    		return EditPartNavigationHandlerUtil.getFirstService(this);
+    	}
+    }
+    else if (direction == PositionConstants.NORTH) {
+    	return EditPartNavigationHandlerUtil.getPrevSibling(this);
+    } else if (direction == PositionConstants.SOUTH && !isExpanded()) {
+    	EditPart nextSibling = EditPartNavigationHandlerUtil.getNextSibling(this);
+    	if (nextSibling != null) {
+    		return nextSibling;
+    	} else {
+    		return this; 
+    	}
+    }
     return super.getRelativeEditPart(direction);
   }
 
diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/EditPartNavigationHandlerUtil.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/EditPartNavigationHandlerUtil.java
index 20ebddf..a6357c0 100644
--- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/EditPartNavigationHandlerUtil.java
+++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/EditPartNavigationHandlerUtil.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 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
@@ -21,8 +21,11 @@
 import org.eclipse.gef.EditPartViewer;
 import org.eclipse.gef.GraphicalEditPart;
 import org.eclipse.gef.LayerConstants;
+import org.eclipse.gef.RootEditPart;
 import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
 import org.eclipse.gef.editparts.LayerManager;
+import org.eclipse.wst.wsdl.ui.internal.asd.design.editparts.model.InterfaceColumn;
+import org.eclipse.wst.wsdl.ui.internal.asd.design.editparts.model.ServiceColumn;
 import org.eclipse.wst.wsdl.ui.internal.asd.design.figures.ComponentReferenceConnection;
 
 
@@ -164,6 +167,99 @@
     return result;
   }
   
+  static EditPart getFirstBinding(EditPart editPart) 
+  {
+	  if (editPart == null) return null;
+	  
+	  RootEditPart rootEditPart = editPart.getRoot();
+	  if (rootEditPart == null) return null;
+	  
+	  List rootEditPartChildren = rootEditPart.getChildren();
+	  if (rootEditPartChildren == null || rootEditPartChildren.size() != 1) return null;
+	  
+	  Object definitionObject = rootEditPartChildren.get(0);
+	  if (! (definitionObject instanceof DefinitionsEditPart)) return null;
+	  
+	  DefinitionsEditPart definitionsEditPart = (DefinitionsEditPart) definitionObject;
+	  
+	  List children = definitionsEditPart.getChildren();
+	  for (int i = 0; i < children.size(); i++) {
+		  if (children.get(i) instanceof BindingColumnEditPart) {
+			  List bindings = ((BindingColumnEditPart) children.get(i)).getChildren();
+			  if (bindings != null && bindings.size() > 0 && bindings.get(0) instanceof BindingEditPart) 
+				  return (BindingEditPart) bindings.get(0);
+		  }
+	  }
+	  return null;
+  }
+  
+  static EditPart getFirstService(EditPart editPart) 
+  {
+	  if (editPart == null) return null;
+	  
+	  RootEditPart rootEditPart = editPart.getRoot();
+	  if (rootEditPart == null) return null;
+	  
+	  List rootEditPartChildren = rootEditPart.getChildren();
+	  if (rootEditPartChildren == null || rootEditPartChildren.size() != 1) return null;
+	  
+	  Object definitionObject = rootEditPartChildren.get(0);
+	  if (! (definitionObject instanceof DefinitionsEditPart)) return null;
+	  
+	  DefinitionsEditPart definitionsEditPart = (DefinitionsEditPart) definitionObject;
+	  
+	  List children = definitionsEditPart.getChildren();
+	  for (int i = 0; i < children.size(); i++) {
+		  Object child = children.get(i);
+		  if (child instanceof ColumnEditPart) {
+			  ColumnEditPart column = (ColumnEditPart) child;
+			  Object model = column.getModel();
+			  
+			  if (model instanceof ServiceColumn) {
+				  List services = column.getChildren();
+				  if (services != null && services.size() > 0 && services.get(0) instanceof ServiceEditPart) {
+					  return (ServiceEditPart) services.get(0);
+				  }
+			  }
+		  }
+	  }
+	  return null;
+  }
+  
+  static EditPart getFirstInterface(EditPart editPart) 
+  {
+	  if (editPart == null) return null;
+	  
+	  RootEditPart rootEditPart = editPart.getRoot();
+	  if (rootEditPart == null) return null;
+	  
+	  List rootEditPartChildren = rootEditPart.getChildren();
+	  if (rootEditPartChildren == null || rootEditPartChildren.size() != 1) return null;
+	  
+	  Object definitionObject = rootEditPartChildren.get(0);
+	  if (! (definitionObject instanceof DefinitionsEditPart)) return null;
+	  
+	  DefinitionsEditPart definitionsEditPart = (DefinitionsEditPart) definitionObject;
+	  
+	  List children = definitionsEditPart.getChildren();
+	  for (int i = 0; i < children.size(); i++) {
+		  Object child = children.get(i);
+		  if (child instanceof ColumnEditPart) {
+			  ColumnEditPart column = (ColumnEditPart) child;
+			  Object model = column.getModel();
+			  
+			  if (model instanceof InterfaceColumn) {
+				  List interfaces = column.getChildren();
+				  if (interfaces != null && interfaces.size() > 0 && interfaces.get(0) instanceof InterfaceEditPart) {
+					  return (InterfaceEditPart) interfaces.get(0);
+				  }
+			  }
+		  }
+	  }
+	  return null;
+  }
+  
+
   static EditPart getSourceConnectionEditPart(AbstractGraphicalEditPart editPart)
   {
     // find the first connection that targets this editPart
diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/EndPointEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/EndPointEditPart.java
index a01c9e0..cd4949a 100644
--- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/EndPointEditPart.java
+++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/EndPointEditPart.java
@@ -290,7 +290,8 @@
       }
       else
       {
-          return null;
+    	  // or to the first unconnected binding
+          return EditPartNavigationHandlerUtil.getFirstBinding(this);
       }
     }
     
diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/InterfaceEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/InterfaceEditPart.java
index b8a64c2..d71ea34 100644
--- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/InterfaceEditPart.java
+++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/InterfaceEditPart.java
@@ -157,11 +157,22 @@
 
   public EditPart getRelativeEditPart(int direction)
   {
-    if (direction == PositionConstants.WEST)
-    {
-      return EditPartNavigationHandlerUtil.getSourceConnectionEditPart(this);     
-    }  
-    return super.getRelativeEditPart(direction);
+	  if (direction == PositionConstants.WEST)
+	  {
+		  EditPart connectedBinding = EditPartNavigationHandlerUtil.getSourceConnectionEditPart(this);
+		  if (connectedBinding != null) {
+			  return connectedBinding;
+		  } else {
+			  return EditPartNavigationHandlerUtil.getFirstBinding(this); 
+		  }
+	  }  
+
+	  EditPart editPart = super.getRelativeEditPart(direction);
+	  if (direction == PositionConstants.NORTH && (editPart == null || editPart == this))
+	  {
+		  editPart = EditPartNavigationHandlerUtil.getPrevSibling(this);
+	  }        
+	  return editPart;
   }
   
   public IFigure getLinkIconColumn() {
diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/MessageReferenceEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/MessageReferenceEditPart.java
index 4cd9946..c3a6505 100644
--- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/MessageReferenceEditPart.java
+++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/MessageReferenceEditPart.java
@@ -268,7 +268,7 @@
   public EditPart getRelativeEditPart(int direction)
   {  
     EditPart editPart = super.getRelativeEditPart(direction);
-    if (direction == PositionConstants.SOUTH && editPart == null)
+    if (direction == PositionConstants.SOUTH && (editPart == null || editPart == this))
     {
       editPart = EditPartNavigationHandlerUtil.getNextInterface(this);
     }        
diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterEditPart.java
index 3015659..f8278c1 100644
--- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterEditPart.java
+++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterEditPart.java
@@ -226,7 +226,7 @@
   public EditPart getRelativeEditPart(int direction)
   {  
     EditPart editPart = super.getRelativeEditPart(direction);
-    if (direction == PositionConstants.SOUTH && editPart == null)
+    if (direction == PositionConstants.SOUTH && (editPart == null || editPart == this))
     {
       editPart = EditPartNavigationHandlerUtil.getNextInterface(this);           
     }       
diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterTypeEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterTypeEditPart.java
index a5f1639..f1847bb 100644
--- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterTypeEditPart.java
+++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ParameterTypeEditPart.java
@@ -317,7 +317,7 @@
 	public EditPart getRelativeEditPart(int direction)
 	{         
 		EditPart editPart = super.getRelativeEditPart(direction);
-		if (direction == PositionConstants.SOUTH && editPart == null)
+		if (direction == PositionConstants.SOUTH && (editPart == null || editPart == this))
 		{
 			editPart = EditPartNavigationHandlerUtil.getNextInterface(this);
 		}   
diff --git a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ServiceEditPart.java b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ServiceEditPart.java
index 2a152af..f03862f 100644
--- a/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ServiceEditPart.java
+++ b/bundles/org.eclipse.wst.wsdl.ui/src-asd/org/eclipse/wst/wsdl/ui/internal/asd/design/editparts/ServiceEditPart.java
@@ -19,9 +19,11 @@
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.Label;
 import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.PositionConstants;
 import org.eclipse.draw2d.ToolbarLayout;
 import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
 import org.eclipse.gef.EditPolicy;
 import org.eclipse.gef.Request;
 import org.eclipse.gef.RequestConstants;
@@ -171,4 +173,18 @@
     }
     return ""; //$NON-NLS-1$
   }
+
+  public EditPart getRelativeEditPart(int direction) {
+	  if (direction == PositionConstants.NORTH )
+	  {
+		  return EditPartNavigationHandlerUtil.getPrevSibling(this);
+	  }    
+
+	  if (direction == PositionConstants.EAST )
+	  {
+		  return EditPartNavigationHandlerUtil.getFirstBinding(this);
+	  }
+
+	  return super.getRelativeEditPart(direction);
+  }
 }