@Override
 public boolean validate(IDocument document, int offset, DocumentEvent event) {
   String[] strs = PySelection.getActivationTokenAndQual(document, offset, false);
   // System.out.println("validating:"+strs[0]+" - "+strs[1]);
   // when we end with a '.', we should start a new completion (and not stay in the old one).
   if (strs[1].length() == 0 && (strs[0].length() == 0 || strs[0].endsWith("."))) {
     // System.out.println(false);
     return false;
   }
   String qualifier = strs[1];
   final boolean useSubstringMatchInCodeCompletion =
       PyCodeCompletionPreferencesPage.getUseSubstringMatchInCodeCompletion();
   String displayString = getDisplayString();
   boolean ret =
       PyCodeCompletionUtils.acceptName(
           useSubstringMatchInCodeCompletion, displayString, qualifier);
   return ret;
 }
  @Override
  public StyledString getStyledDisplayString(
      IDocument document, int offset, BoldStylerProvider boldStylerProvider) {
    // Extension enabled with enableColoredLabels(true); on PyContentAssistant.
    String[] strs = PySelection.getActivationTokenAndQual(document, offset, false);
    if (strs[1].length() == 0 && (strs[0].length() == 0 || strs[0].endsWith("."))) {
      StyledString styledString = new StyledString(getDisplayString());
      return styledString;
    }
    String qualifier = strs[1];

    final boolean useSubstringMatchInCodeCompletion =
        PyCodeCompletionPreferencesPage.getUseSubstringMatchInCodeCompletion();
    String original = getDisplayString();
    // Qualifier is everything after " - ".
    int index = original.indexOf(" - ");
    String strBeforeQualifier;
    if (index != -1) {
      strBeforeQualifier = original.substring(0, index);
    } else {
      strBeforeQualifier = original;
    }

    StyledString styledString = new StyledString();
    if (useSubstringMatchInCodeCompletion) {
      int i = strBeforeQualifier.toLowerCase().indexOf(qualifier.toLowerCase());
      if (i < 0) {
        styledString.append(strBeforeQualifier);
      } else {
        styledString.append(strBeforeQualifier.substring(0, i));
        styledString.append(
            strBeforeQualifier.substring(i, i + qualifier.length()),
            boldStylerProvider.getBoldStyler());
        styledString.append(
            strBeforeQualifier.substring(i + qualifier.length(), strBeforeQualifier.length()));
      }
    } else {
      styledString.append(strBeforeQualifier);
    }
    if (styledString.length() < original.length()) {
      styledString.append(original.substring(styledString.length()), StyledString.QUALIFIER_STYLER);
    }
    return styledString;
  }