Implementation for  Bug 315465 -  [binding-editor] Creating callout-to-field via binding editor
diff --git a/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/internal/ui/bindingeditor/BindingConfiguration.java b/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/internal/ui/bindingeditor/BindingConfiguration.java
index d80e540..b6eda5a 100644
--- a/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/internal/ui/bindingeditor/BindingConfiguration.java
+++ b/plugins/org.eclipse.objectteams.otdt.ui/src/org/eclipse/objectteams/otdt/internal/ui/bindingeditor/BindingConfiguration.java
@@ -41,6 +41,7 @@
 import org.eclipse.jdt.core.dom.ArrayType;
 import org.eclipse.jdt.core.dom.CallinMappingDeclaration;
 import org.eclipse.jdt.core.dom.CalloutMappingDeclaration;
+import org.eclipse.jdt.core.dom.FieldAccessSpec;
 import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.MethodMappingElement;
 import org.eclipse.jdt.core.dom.MethodSpec;
@@ -95,6 +96,7 @@
 	private static final String OT_GENERATED_INDICATOR = "_OT$"; //$NON-NLS-1$
 	private static final String FAKED_METHOD_NAME = '\''+Messages.BindingConfiguration_new_method_label;
 	private static final Object[] EMPTY_LIST = new Object[0];
+	private static final String[] NO_STRINGS = new String[0];
 	private static final int OT_CALLOUT = 0x1000000;
 	private static final int OT_CALLOUT_OVERRIDE = 0x2000000;
 	
@@ -112,7 +114,7 @@
 	private Button _callinAfterBtn;
 	private RoleTypeDeclaration _selectedRole;
 	private CalloutMappingDeclaration _selectedCalloutDecl;
-	private CalloutMappingDeclaration _calloutMapping;
+	private CalloutMappingDeclaration[] _calloutMappings;
 	private CallinMappingDeclaration _selectedCallinDecl;
 	private CallinMappingDeclaration _callinMapping;
 	private BindingEditor _bindingEditor;
@@ -1042,7 +1044,17 @@
 		
 		if (_newCallout)
 		{
-			return createCalloutMapping(ast, roleMethod, baseMethods[0], methMapModifier, calloutOverride, signatureFlag);
+			if (baseMethods[0] instanceof IField) {
+				this._calloutMappings = new CalloutMappingDeclaration[] {
+					createCalloutMapping(ast, roleMethod, baseMethods[0], Modifier.OT_GET_CALLOUT, calloutOverride, signatureFlag),
+				    createCalloutMapping(ast, roleMethod, baseMethods[0], Modifier.OT_SET_CALLOUT, calloutOverride, signatureFlag)};
+				return this._calloutMappings[0] != null && this._calloutMappings[1] != null;
+			} else {
+				this._calloutMappings = new CalloutMappingDeclaration[] {
+					createCalloutMapping(ast, roleMethod, baseMethods[0], methMapModifier, calloutOverride, signatureFlag)
+				};
+				return this._calloutMappings[0] != null;
+			}
 		}
 		else
 		{
@@ -1107,10 +1119,10 @@
 		return true;
 	}
 	
-	private boolean createCalloutMapping(
+	private CalloutMappingDeclaration createCalloutMapping(
 			AST ast, 
 			IMethod roleMethod, 
-			IMember baseMethod, 
+			IMember baseMember, 
 			int bindingModifier, 
 			boolean calloutOverride, 
 			boolean signatureFlag)
@@ -1122,39 +1134,77 @@
 		{
 			selRolMethSpec = (MethodSpec)_selectedCalloutDecl.getRoleMappingElement();
 			selBasMethSpec = _selectedCalloutDecl.getBaseMappingElement();
-			if (baseMethod instanceof IMethod && !(selBasMethSpec instanceof MethodSpec))
-				return false; // cannot change from method to field.
+			if (baseMember instanceof IMethod && !(selBasMethSpec instanceof MethodSpec))
+				return null; // cannot change from method to field.
+			if (baseMember instanceof IField && !(selBasMethSpec instanceof FieldAccessSpec))
+				return null; // cannot change from field to method.
 		}
 		
 		MethodMappingElement baseMethodSpec =  null;
-		if (baseMethod instanceof IMethod)
+		if (baseMember instanceof IMethod)
 			baseMethodSpec = createMethodSpec(
 				ast, 
-				(IMethod)baseMethod, 
+				(IMethod)baseMember, 
 				(MethodSpec)selBasMethSpec, 
 				signatureFlag);
-		/* FIXME: implement all other combinations
 		else
-			baseMethodSpec = createFieldAccessSpec(ast, (IField)baseIMember, baseMSpec, signatureFlag);
-		*/
+			try {
+				IField iField = (IField)baseMember;
+				baseMethodSpec = ASTNodeCreator.createFieldAccSpec(
+						ast,
+						(bindingModifier == Modifier.OT_GET_CALLOUT)/*isSetter*/,
+						iField.getElementName(),
+						Signature.toString(iField.getTypeSignature()),
+						signatureFlag
+				);
+				;
+			} catch (Exception e) {
+				return null;
+			}
+
 		if (baseMethodSpec == null)
 		{
-			return false;
+			return null;
 		}    
 		
 		MethodMappingElement roleMethodSpec = null;
 		if (roleMethod.getElementName().startsWith(FAKED_METHOD_NAME))
 		{
-			if (baseMethod instanceof IMethod)
+			if (baseMember instanceof IMethod)
 				roleMethodSpec = createMethodSpec(
 						ast, 
-						(IMethod)baseMethod, 
-						(MethodSpec)selBasMethSpec, 
+						(IMethod)baseMember, 
+						null/*givenSpec*/, 
 						signatureFlag);
-			/* FIXME: implement: 
 			else
-				roleMethodSpec = createFieldAccess((IField)baseMethod...);
-			 */  
+				try {
+					IField baseField = (IField) baseMember;
+					String name = baseMember.getElementName();
+					if (name.length() == 1)
+						name = name.toUpperCase();
+					else
+						name = Character.toUpperCase(name.charAt(0))+name.substring(1);
+					if (bindingModifier == Modifier.OT_GET_CALLOUT)
+						roleMethodSpec = createMethodSpec(
+								ast,
+								baseField.getTypeSignature(),
+								"get"+name, //$NON-NLS-1$
+								NO_STRINGS/*parameterTypes*/,
+								NO_STRINGS/*parameterNames*/,
+								null/*givenSpec*/,
+								signatureFlag);
+					else
+						roleMethodSpec = createMethodSpec(
+								ast,
+								"V", //$NON-NLS-1$
+								"set"+name, //$NON-NLS-1$
+								new String[]{baseField.getTypeSignature()},
+								new String[]{baseMember.getElementName()},
+								null/*givenSpec*/,
+								signatureFlag);						
+				} catch (JavaModelException e) {
+					return null;
+				}
 		}
 		else
 		{
@@ -1166,7 +1216,7 @@
 		}
 		if (roleMethodSpec == null)
 		{
-			return false;
+			return null;
 		}
 		
 		if (_selectedCalloutDecl == null)
@@ -1174,45 +1224,35 @@
 			_parameterMappings = null;
 		}
 		
-		_calloutMapping =  ASTNodeCreator.createCalloutMappingDeclaration(
+		return ASTNodeCreator.createCalloutMappingDeclaration(
 				ast, 
 				null, 
 				0, // modifiers 
 				roleMethodSpec, 
 				baseMethodSpec, 
-				bindingModifier, // FIXME(SH): not yet provided from caller
+				bindingModifier,
 				_parameterMappings, 
 				calloutOverride, 
 				signatureFlag);
 
-		return true;
+	}
+	
+	private MethodSpec createMethodSpec(AST ast, IMethod baseMember, MethodSpec givenMethodSpec, boolean signatureFlag) {
+		try {
+			return createMethodSpec(ast, baseMember.getReturnType(), baseMember.getElementName(), baseMember.getParameterTypes(), baseMember.getParameterNames(), givenMethodSpec, signatureFlag);
+		} catch (JavaModelException e) {
+			return null;
+		}
 	}
 
-	private MethodSpec createMethodSpec(AST ast, IMethod iMethod, MethodSpec givenMethodSpec, boolean signatureFlag)
+	private MethodSpec createMethodSpec(AST ast, 
+										String typeSignature, String name, String[] parameterTypes, String[] parameterNames, 
+										MethodSpec givenMethodSpec, boolean signatureFlag)
 	{
-		String returnTypeString;
-		try
-		{
-			returnTypeString = Signature.toString(iMethod.getReturnType());
-		}
-		catch (JavaModelException e)
-		{
-			return null;    
-		}
+		String returnTypeString = Signature.toString(typeSignature);
 		
 		Type returnType = ASTNodeCreator.createType(ast, returnTypeString);
 		
-		String [] parameterTypes = iMethod.getParameterTypes();
-		String [] parameterNames = null;
-		
-		try
-		{
-			parameterNames = iMethod.getParameterNames();            
-		}
-		catch (JavaModelException e1)
-		{
-			return null;
-		}
 		
 		List mSpecParameters = null;
 		if (givenMethodSpec != null)
@@ -1246,7 +1286,7 @@
 		
 		MethodSpec methodSpec = ASTNodeCreator.createMethodSpec(
 				ast,
-				iMethod.getElementName(),
+				name,
 				returnType,
 				methodParameters,
 				signatureFlag
@@ -1255,7 +1295,7 @@
 		
 		return methodSpec;
 	}
-	
+
 	//copied from org.soothsayer.util.ASTNodeHelper;
 	public static String getMethodSignature(IMethod meth)
 	{
@@ -1320,13 +1360,13 @@
 			currentRole= (RoleTypeDeclaration)ASTNodes.getParent(_selectedRole, ASTNode.ROLE_TYPE_DECLARATION);
 		}
 		
-		_calloutMapping = null;
+		_calloutMappings = null;
 		_callinMapping = null;
 		int selectedIndex = -1;
 		
 		if (createMethodMapping())
 		{
-			if (_calloutMapping != null)
+			if (_calloutMappings != null)
 			{
 				if (_selectedCalloutDecl != null)
 				{
@@ -1340,11 +1380,15 @@
 				}
 				
 				if (selectedIndex == -1){
-					_selectedRole.bodyDeclarations().add(_calloutMapping);
+					_selectedRole.bodyDeclarations().add(_calloutMappings[0]);
+					if (_calloutMappings.length>1)
+						_selectedRole.bodyDeclarations().add(_calloutMappings[1]);
 				}
 				else
 				{
-					_selectedRole.bodyDeclarations().add(selectedIndex, _calloutMapping);
+					_selectedRole.bodyDeclarations().add(selectedIndex, _calloutMappings[0]);
+					if (_calloutMappings.length>1)
+						_selectedRole.bodyDeclarations().add(selectedIndex, _calloutMappings[1]);
 				}
 			}
 			
@@ -1380,10 +1424,13 @@
 			
 			_bindingEditor.refresh();
 			
-			AbstractMethodMappingDeclaration mapping = _callinMapping;
-			if (mapping == null)
-				mapping = _calloutMapping;
-			_bindingEditor.methodBindingAdded(mapping);
+			if (this._callinMapping != null) {
+				_bindingEditor.methodBindingAdded(this._callinMapping);
+			} else {
+				_bindingEditor.methodBindingAdded(this._calloutMappings[0]);
+				if (this._calloutMappings.length > 1)
+					_bindingEditor.methodBindingAdded(this._calloutMappings[1]);
+			}
 		}
 		else
 		{