PR 40769: improve choice selector:
- set choice selector outfit to normal java proposal popup
- added focus capability
- added trigger chars
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/ParameterGuesser.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/ParameterGuesser.java
index 1bfc89a..e61af4d 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/ParameterGuesser.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/ParameterGuesser.java
@@ -54,16 +54,18 @@
 		public final int variableType;
 		public final int positionScore;
 		public boolean alreadyMatched;
+		public char[] triggerChars;
 		
 		/**
 		 * Creates a variable.
 		 */
-		public Variable(String typePackage, String typeName, String name, int variableType, int positionScore) {
+		public Variable(String typePackage, String typeName, String name, int variableType, int positionScore, char[] triggers) {
 			this.typePackage= typePackage;
 			this.typeName= typeName;
 			this.name= name;
 			this.variableType= variableType;
 			this.positionScore= positionScore;
+			triggerChars= triggers;
 		}
 
 		/*
@@ -125,10 +127,10 @@
 				thisPkg= new String();
 				thisType= fEnclosingTypeName;
 			}
-			addVariable(Variable.FIELD, thisPkg.toCharArray(), thisType.toCharArray(), "this".toCharArray()); //$NON-NLS-1$
-			addVariable(Variable.FIELD, "java.lang".toCharArray(), "Object".toCharArray(), "null".toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			addVariable(Variable.LOCAL, new char[0], "boolean".toCharArray(), "true".toCharArray());  //$NON-NLS-1$//$NON-NLS-2$
-			addVariable(Variable.LOCAL, new char[0], "boolean".toCharArray(), "false".toCharArray());  //$NON-NLS-1$//$NON-NLS-2$
+			addVariable(Variable.FIELD, thisPkg.toCharArray(), thisType.toCharArray(), "this".toCharArray(), new char[] {'.'}); //$NON-NLS-1$
+			addVariable(Variable.FIELD, "java.lang".toCharArray(), "Object".toCharArray(), "null".toCharArray(), new char[0]); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			addVariable(Variable.LOCAL, new char[0], "boolean".toCharArray(), "true".toCharArray(), new char[0]);  //$NON-NLS-1$//$NON-NLS-2$
+			addVariable(Variable.LOCAL, new char[0], "boolean".toCharArray(), "false".toCharArray(), new char[0]);  //$NON-NLS-1$//$NON-NLS-2$
 			
 			return fVariables;
 		}
@@ -160,8 +162,8 @@
 			return !declaringTypeName.equals(fEnclosingTypeName);
 		}
 
-		private void addVariable(int varType, char[] typePackageName, char[] typeName, char[] name) {
-			fVariables.add(new Variable(new String(typePackageName), new String(typeName), new String(name), varType, fVariables.size()));
+		private void addVariable(int varType, char[] typePackageName, char[] typeName, char[] name, char[] triggers) {
+			fVariables.add(new Variable(new String(typePackageName), new String(typeName), new String(name), varType, fVariables.size(), triggers));
 		}
 
 		/*
@@ -171,19 +173,32 @@
 			char[] typePackageName, char[] typeName, char[] completionName, int modifiers, int completionStart,
 			int completionEnd, int relevance)
 		{
+			char[] triggers= isPrimitive(typeName) ? new char[0] : new char[] {'.'};
 			if (!isInherited(new String(declaringTypeName)))
-				addVariable(Variable.FIELD, typePackageName, typeName, name);
+				addVariable(Variable.FIELD, typePackageName, typeName, name, triggers);
 			else
-				addVariable(Variable.INHERITED_FIELD, typePackageName, typeName, name);
+				addVariable(Variable.INHERITED_FIELD, typePackageName, typeName, name, triggers);
 		}
 	
+		/**
+		 * Returns <code>true</code> if <code>typeName</code> is the name of a primitive type.
+		 * 
+		 * @param typeName the type to check
+		 * @return <code>true</code> if <code>typeName</code> is the name of a primitive type
+		 */
+		private boolean isPrimitive(char[] typeName) {
+			String s= new String(typeName);
+			return "boolean".equals(s) || "byte".equals(s) || "short".equals(s) || "int".equals(s) || "long".equals(s) || "float".equals(s) || "double".equals(s) || "char".equals(s); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
+		}
+
 		/*
 		 * @see ICompletionRequestor#acceptLocalVariable(char[], char[], char[], int, int, int, int)
 		 */
 		public void acceptLocalVariable(char[] name, char[] typePackageName, char[] typeName, int modifiers,
 			int completionStart, int completionEnd, int relevance)
 		{
-			addVariable(Variable.LOCAL, typePackageName, typeName, name);
+			char[] triggers= isPrimitive(typeName) ? new char[0] : new char[] {'.'};
+			addVariable(Variable.LOCAL, typePackageName, typeName, name, triggers);
 		}
 		
 		/*
@@ -192,7 +207,8 @@
 		public void acceptMethod(char[] declaringTypePackageName, char[] declaringTypeName, char[] selector, char[][] parameterPackageNames, char[][] parameterTypeNames, char[][] parameterNames, char[] returnTypePackageName, char[] returnTypeName, char[] completionName, int modifiers, int completionStart, int completionEnd, int relevance) {
 			// TODO: for now: only add zero-arg methods.
 			if (parameterNames.length == 0) {
-				addVariable(isInherited(new String(declaringTypeName)) ? Variable.INHERITED_METHOD : Variable.METHOD, returnTypePackageName, returnTypeName, completionName);
+				char[] triggers= isPrimitive(returnTypeName) ? new char[0] : new char[] {'.'};
+				addVariable(isInherited(new String(declaringTypeName)) ? Variable.INHERITED_METHOD : Variable.METHOD, returnTypePackageName, returnTypeName, completionName, triggers);
 			}
 		}
 	}
@@ -302,7 +318,12 @@
 		for (Iterator it= typeMatches.iterator(); it.hasNext();) {
 			Variable v= (Variable)it.next();
 			if (i == 0) v.alreadyMatched= true;
-			ret[i++]= new JavaCompletionProposal(v.name, offset, paramName.length(), null, null, ret.length - i);
+			JavaCompletionProposal proposal= new JavaCompletionProposal(v.name, offset, paramName.length(), null, null, ret.length - i);
+			char[] triggers= new char[v.triggerChars.length + 1];
+			System.arraycopy(v.triggerChars, 0, triggers, 0, v.triggerChars.length);
+			triggers[triggers.length - 1]= ';';
+			proposal.setTriggerCharacters(triggers);
+			ret[i++]= proposal;
 		}
 		return ret;
 	}
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/ParameterGuessingProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/ParameterGuessingProposal.java
index a870c84..a8af15f 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/ParameterGuessingProposal.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/ParameterGuessingProposal.java
@@ -51,6 +51,7 @@
 	private final ITextViewer fViewer;
 	private IRegion fSelectedRegion; // initialized by apply()
 	private ICompletionProposal[][] fChoices; // initialized by guessParameters()
+	private static final String TYPE= "ParamterGuessingProposal_"; //$NON-NLS-1$
 		
 	/**
 	 * Creates a template proposal with a template and its context.
@@ -140,10 +141,11 @@
 				LinkedPositionManager manager= new LinkedPositionManager(document);
 				for (int i= 0; i != parameterCount; i++) {
 					int positionOffset= baseOffset + positionOffsets[i];
+					String type= TYPE + i;
 					if (fChoices[i].length == 0) {
-						manager.addPosition(positionOffset, positionLengths[i]);
+						manager.addPosition(positionOffset, positionLengths[i], type);
 					} else {
-						manager.addPosition(positionOffset, positionLengths[i], fChoices[i]);
+						manager.addPosition(positionOffset, positionLengths[i], type, fChoices[i]);
 					}
 				}
 				
@@ -226,7 +228,9 @@
 			if (i != 0)
 				buffer.append(", "); //$NON-NLS-1$
 			offsets[i]= buffer.length();
-			buffer.append(fParameterNames[i]);
+			ICompletionProposal[] proposals= fChoices[i];
+			String display= proposals.length > 0 ? proposals[0].getDisplayString() : new String(fParameterNames[i]);
+			buffer.append(display);
 			lengths[i]= buffer.length() - offsets[i];			
 		}