public override Innovator.Client.IPromise<CompletionContext> ShowCompletions(CodeEditor control)
    {
      var length = control.Editor.Document.TextLength;
      var caret = control.Editor.CaretOffset;
      var data = new CompletionContext();

      if (caret > 0)
      {
        string[][] completions = null;
        if (control.Editor.Document.GetCharAt(caret - 1) == '\\')
          completions = _completionInfo;

        if (completions != null)
        {
          data.Items = completions
            .OrderBy(i => i[0].ToLowerInvariant())
            .ThenBy(i => i[1])
            .Select(i => new BasicCompletionData() {
              Content = GetSpan(new Run(i[0] + " "), new Run(i[1])
              {
                Foreground = Brushes.Gray
              }),
              Text = i[0],
              Action = () => i[0]
            });
        }
      }

      if (data.Items.Any())
      {
        var items = data.Items.ToArray();
        var contextItems = items.OfType<IContextCompletions>();
        foreach (var contextItem in contextItems)
        {
          contextItem.SetContext(this, control);
        }

        control.ShowCompletionWindow(items, data.Overlap);
      }

      return Promises.Resolved(data);
    }
    public override IPromise<CompletionContext> ShowCompletions(CodeEditor control)
    {
      var length = control.Editor.Document.TextLength;
      var caret = control.Editor.CaretOffset;

      if (control.Editor.CaretOffset >= 2 && control.Editor.Document.GetText(control.Editor.CaretOffset - 2, 2) == "<!")
      {
        var context = new CompletionContext()
        {
          Items = new ICompletionData[] {
            new BasicCompletionData() {
              Text = "--",
              Content = "-- (Comment)",
              Action = () => "---->",
              CaretOffset = -3
            },
            new BasicCompletionData() {
              Text = "[CDATA[",
              Action = () => "[CDATA[]]>",
              CaretOffset = -3
            }
          }
        };

        control.ShowCompletionWindow(context.Items, context.Overlap);

        return Promises.Resolved(context);
      }
      else
      {
        return this.GetCompletions(control.Document, control.Editor.CaretOffset, this.SoapAction)
          .ToPromise()
          .UiPromise(control)
          .Convert(data => {
            if (length != control.Editor.Document.TextLength
              || caret != control.Editor.CaretOffset)
            {
              ShowCompletions(control);
              return null;
            }

            if (data.Items.Any())
            {
              var items = data.Items.ToArray();
              var contextItems = items.OfType<IContextCompletions>();
              foreach (var contextItem in contextItems)
              {
                contextItem.SetContext(this, control);
              }

              control.ShowCompletionWindow(items, data.Overlap);
            }

            return data;
          });
      }

    }
 public override void HandleTextEntered(CodeEditor control, string insertText)
 {
   switch (insertText)
   {
     case ">":
       var doc = control.Editor.Document;
       var caret = control.Editor.CaretOffset;
       var text = doc.GetText(0, caret);
       var elementName = XmlParser.GetOpenElement(text);
       if (!string.IsNullOrEmpty(elementName))
       {
         var insert = "</" + elementName + ">";
         if (!doc.GetText(caret, doc.TextLength - caret).Trim().StartsWith(insert))
         {
           doc.Insert(caret, insert, AnchorMovementType.BeforeInsertion);
         }
       }
       break;
     default:
       var result = HandleTextEntered(control.Editor.Document, control.Editor.CaretOffset, insertText);
       if (result.Any())
       {
         control.ShowCompletionWindow(result, 0);
       }
       break;
   }
 }
    public override Innovator.Client.IPromise<CompletionContext> ShowCompletions(CodeEditor control)
    {
      var length = control.Editor.Document.TextLength;
      var caret = control.Editor.CaretOffset;
      var data = new CompletionContext();

      if (caret > 0 && control.Editor.Document.GetCharAt(caret - 1) == '\\')
      {
        data.Items = _completionInfo
          .OrderBy(i => i[0].ToLowerInvariant())
          .ThenBy(i => i[1])
          .Select(i => new BasicCompletionData() {
            Content = FormatText.Span(FormatText.Text(i[0] + " "), FormatText.MutedText(i[1])),
            Text = i[0],
            Action = () => i[0]
          });
      }

      if (data.Items.Any())
      {
        var items = data.Items.ToArray();
        var contextItems = items.OfType<IContextCompletions>();
        foreach (var contextItem in contextItems)
        {
          contextItem.SetContext(this, control);
        }

        control.ShowCompletionWindow(items, data.Overlap);
      }

      return Promises.Resolved(data);
    }
    public Innovator.Client.IPromise<CompletionContext> ShowCompletions(CodeEditor control)
    {
      var length = control.Editor.Document.TextLength;
      var caret = control.Editor.CaretOffset;

      var text = control.Editor.Text;

      return _sql.Completions(text.Substring(0, caret), control.Document, caret, null)
        .UiPromise(control)
        .Convert(data =>
        {
          if (length != control.Editor.Document.TextLength
            || caret != control.Editor.CaretOffset)
          {
            ShowCompletions(control);
            return null;
          }

          if (data.Items.Any())
          {
            var items = data.Items.ToArray();
            var contextItems = items.OfType<IContextCompletions>();
            foreach (var contextItem in contextItems)
            {
              contextItem.SetContext(this, control);
            }

            control.ShowCompletionWindow(items, data.Overlap);
          }

          return data;
        });
    }