Fixed: [Issue 159] 	Content assist for default value is broken.

Added support for enum literals in proposed values. Fixed proposals for
enum-based options.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
index e42a177..2c389a4 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
@@ -162,6 +162,19 @@
     return context.getCurrentNode().getText().equals(CLOSING_BRACKET.toString());
   }
 
+  private boolean isLastWordFromCaretPositionEqualTo(String word, ContentAssistContext context) {
+    StyledText styledText = context.getViewer().getTextWidget();
+    int valueLength = word.length();
+    int start = styledText.getCaretOffset() - valueLength;
+    if (start < 0) return false;
+    String previousWord = styledText.getTextRange(start, valueLength);
+    return word.equals(previousWord);
+  }
+
+  private boolean isKeyword(EObject object, CommonKeyword keyword) {
+    return object instanceof Keyword && keyword.hasValue(((Keyword) object).getValue());
+  }
+  
   private void proposeEqualProto2(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     proposeAndAccept(EQUAL_PROTO2_IN_QUOTES, context, acceptor);
   }
@@ -171,10 +184,6 @@
     proposeAndAccept(proposalText.toString(), context, acceptor);
   }
 
-  private boolean isKeyword(EObject object, CommonKeyword keyword) {
-    return object instanceof Keyword && keyword.hasValue(((Keyword) object).getValue());
-  }
-
   private boolean isBoolProposalValid(ContentAssistContext context) {
     Property p = propertyFrom(context);
     return p != null && properties.isBool(p);
@@ -218,16 +227,6 @@
     return true;
   }
 
-  private void createAndAccept(CompoundElement display, int cursorPosition, ContentAssistContext context,
-      ICompletionProposalAcceptor acceptor) {
-    ICompletionProposal proposal = createCompletionProposal(display, context);
-    if (proposal instanceof ConfigurableCompletionProposal) {
-      ConfigurableCompletionProposal configurable = (ConfigurableCompletionProposal) proposal;
-      configurable.setCursorPosition(cursorPosition);
-    }
-    acceptor.accept(proposal);
-  }
-
   private <T> T extractElementFromContext(ContentAssistContext context, Class<T> type) {
     EObject model = context.getCurrentModel();
     // this is most likely a bug in Xtext:
@@ -334,26 +333,13 @@
   private void proposeOption(Property option, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     String displayString = option.getName();
     String proposalText = displayString + space() + EQUAL + space();
-    proposePropertyValue(option, proposalText, displayString, imageForOption(), context, acceptor);
-  }
-  
-  @Override public void completeDefaultValueFieldOption_Value(EObject model, Assignment assignment, 
-      ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-    if (!(model instanceof Property)) return;
-    Property p = (Property) model;
-    proposePropertyValue(p, "", null, defaultImage(), context, acceptor);
-  }
-  
-  private void proposePropertyValue(Property p, String proposalText, String displayString, Image image, 
-      ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-    Object value = defaultValueOf(p);
-    if (value == null) return;
-    String text = proposalText + value;
-    ICompletionProposal proposal = createCompletionProposal(text, displayString, image, context);
+    Object value = defaultValueOf(option);
+    if (value != null) proposalText = proposalText + value;
+    ICompletionProposal proposal = createCompletionProposal(proposalText, displayString, imageForOption(), context);
     if (value == EMPTY_STRING && proposal instanceof ConfigurableCompletionProposal) {
       // set cursor between the proposal's quotes
       ConfigurableCompletionProposal configurable = (ConfigurableCompletionProposal) proposal;
-      configurable.setCursorPosition(text.length() - 1);
+      configurable.setCursorPosition(proposalText.length() - 1);
     }
     acceptor.accept(proposal);
   }
@@ -364,6 +350,14 @@
     return null;
   }
   
+  @Override public void completeDefaultValueFieldOption_Value(EObject model, Assignment assignment, 
+      ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+    if (!(model instanceof Property)) return;
+    Property p = (Property) model;
+    if (!properties.isOptional(p)) return;
+    proposeDefaultValue(p, context, acceptor);
+  }
+  
   @Override public ICompletionProposal createCompletionProposal(String proposal, String displayString, Image image,
       ContentAssistContext contentAssistContext) {
     StyledString styled = null;
@@ -376,10 +370,6 @@
       ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
     if (!(model instanceof NativeFieldOption)) return;
     NativeFieldOption option = (NativeFieldOption) model;
-    if (fieldOptions.isDefaultValueOption(option)) {
-      proposeDefaultValue(option, context, acceptor);
-      return;
-    }
     ProtoDescriptor descriptor = descriptorProvider.primaryDescriptor();
     Property property = (Property) fieldOptions.sourceOf(option);
     Enum enumType = descriptor.enumTypeOf(property);
@@ -390,17 +380,6 @@
     proposePrimitiveValues(property, context, acceptor);
   }
 
-  private void proposeDefaultValue(FieldOption option, ContentAssistContext context,
-      ICompletionProposalAcceptor acceptor) {
-    Property property = (Property) option.eContainer();
-    if (!properties.isOptional(property)) return;
-    if (proposePrimitiveValues(property, context, acceptor)) return;
-    Enum enumType = finder.enumTypeOf(property);
-    if (enumType != null) {
-      proposeAndAccept(enumType, context, acceptor);
-    }
-  }
-
   private boolean proposePrimitiveValues(Property property, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
     if (properties.isBool(property)) {
@@ -419,29 +398,24 @@
     proposeAndAccept(keywords, context, acceptor);
   }
 
-  private void proposeEmptyString(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-    createAndAccept(EMPTY_STRING, 1, context, acceptor);
-  }
-
   private void proposeAndAccept(CommonKeyword[] keywords, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
     for (CommonKeyword keyword : keywords)
       proposeAndAccept(keyword.toString(), context, acceptor);
   }
 
-  private void proposeAndAccept(Enum enumType, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-    Image image = imageHelper.getImage(images.imageFor(Literal.class));
-    for (Literal literal : getAllContentsOfType(enumType, Literal.class))
-      proposeAndAccept(literal.getName(), image, context, acceptor);
+  private void proposeEmptyString(ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+    createAndAccept(EMPTY_STRING, 1, context, acceptor);
   }
 
-  private boolean isLastWordFromCaretPositionEqualTo(String word, ContentAssistContext context) {
-    StyledText styledText = context.getViewer().getTextWidget();
-    int valueLength = word.length();
-    int start = styledText.getCaretOffset() - valueLength;
-    if (start < 0) return false;
-    String previousWord = styledText.getTextRange(start, valueLength);
-    return word.equals(previousWord);
+  private void createAndAccept(CompoundElement display, int cursorPosition, ContentAssistContext context,
+      ICompletionProposalAcceptor acceptor) {
+    ICompletionProposal proposal = createCompletionProposal(display, context);
+    if (proposal instanceof ConfigurableCompletionProposal) {
+      ConfigurableCompletionProposal configurable = (ConfigurableCompletionProposal) proposal;
+      configurable.setCursorPosition(cursorPosition);
+    }
+    acceptor.accept(proposal);
   }
 
   @Override public void completeCustomOption_Source(EObject model, Assignment assignment,
@@ -547,7 +521,7 @@
     IndexedElement e = options.lastFieldSourceFrom(option);
     if (e == null) e = options.sourceOf(option);
     if (e instanceof Property) {
-      proposeAndAcceptOptionFieldValue((Property) e, context, acceptor);
+      proposeDefaultValue((Property) e, context, acceptor);
     }
   }
 
@@ -559,11 +533,11 @@
     IndexedElement e = fieldOptions.lastFieldSourceFrom(option);
     if (e == null) e = fieldOptions.sourceOf(option);
     if (e instanceof Property) {
-      proposeAndAcceptOptionFieldValue((Property) e, context, acceptor);
+      proposeDefaultValue((Property) e, context, acceptor);
     }
   }
 
-  private void proposeAndAcceptOptionFieldValue(Property property, ContentAssistContext context,
+  private void proposeDefaultValue(Property property, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
     if (property == null) return;
     if (proposePrimitiveValues(property, context, acceptor)) return;
@@ -573,6 +547,12 @@
     }
   }
 
+  private void proposeAndAccept(Enum enumType, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+    Image image = imageHelper.getImage(images.imageFor(Literal.class));
+    for (Literal literal : getAllContentsOfType(enumType, Literal.class))
+      proposeAndAccept(literal.getName(), image, context, acceptor);
+  }
+
   private void proposeAndAccept(String proposalText, Image image, ContentAssistContext context,
       ICompletionProposalAcceptor acceptor) {
     ICompletionProposal proposal = createCompletionProposal(proposalText, proposalText, image, context);