@Override
 protected void doSetValue(Object value) {
   if (value instanceof CellEditorPartialValue) {
     CellEditorPartialValue partialValue = (CellEditorPartialValue) value;
     xtextAdapter.getXtextDocument().set(partialValue.getWholeText());
     xtextAdapter.sourceviewer.setDocument(
         xtextAdapter.getXtextDocument(),
         xtextAdapter.sourceviewer.getAnnotationModel(),
         partialValue.getOffset(),
         partialValue.getLength());
   } else {
     super.doSetValue(value);
   }
   // Reset the undo manager to prevend deletion of complete text if the
   // user hits ctrl+z after cell editor opens
   xtextAdapter.sourceviewer.getUndoManager().reset();
 }
  /**
   * Creates an {@link SourceViewer} and returns the {@link StyledText} widget of the viewer as the
   * cell editors control. Some code is copied from {@link XtextEditor}.
   */
  @Override
  protected Control createControl(Composite parent) {
    StyledText styledText = (StyledText) super.createControl(parent);
    styledText.addFocusListener(
        new FocusAdapter() {
          public void focusLost(FocusEvent e) {
            XtextStyledTextCellEditor.this.focusLost();
          }
        });

    // adapt to xtext
    xtextAdapter =
        new StyledTextXtextAdapter(
            injector,
            contextFakeResourceProvider == null
                ? IXtextFakeContextResourcesProvider.NULL_CONTEXT_PROVIDER
                : contextFakeResourceProvider,
            project);
    xtextAdapter.adapt(styledText);
    if (provider != null) {
      xtextAdapter
          .getFakeResourceContext()
          .getFakeResource()
          .eAdapters()
          .add(new ContextElementAdapter(provider));
    }

    // configure content assist
    final IContentAssistant contentAssistant = xtextAdapter.getContentAssistant();

    completionProposalAdapter =
        new CompletionProposalAdapter(
            styledText, contentAssistant, KeyStroke.getInstance(SWT.CTRL, SWT.SPACE), null);

    // This listener notifies the modification, when text is selected via
    // proposal. A ModifyEvent is not thrown by the StyledText in this case.
    xtextAdapter
        .getXtextSourceviewer()
        .addTextListener(
            new ITextListener() {
              public void textChanged(TextEvent event) {
                editOccured(null);
              }
            });

    if ((styledText.getStyle() & SWT.SINGLE) != 0) {
      // The regular key down event is too late (after popup is closed
      // again).
      // when using the StyledText.VerifyKey event (3005), we get the
      // event early enough!
      styledText.addListener(
          3005,
          new Listener() {
            public void handleEvent(Event event) {
              if (event.character == SWT.CR && !completionProposalAdapter.isProposalPopupOpen()) {
                focusLost();
              }
            }
          });
    }
    styledText.addListener(
        3005,
        new Listener() {
          public void handleEvent(Event event) {
            if (event.character == '\u001b' // ESC
                && !completionProposalAdapter.isProposalPopupOpen()) {
              XtextStyledTextCellEditor.this.fireCancelEditor();
            }
          }
        });

    initContextMenu(styledText);

    return styledText;
  }
 public void setVisibleRegion(int start, int length) {
   xtextAdapter.setVisibleRegion(start, length);
 }
 @Override
 public void dispose() {
   xtextAdapter.dispose();
   super.dispose();
 }