Scintilla.NET Autocomplete автоматически выбирает первый элемент (C #) - PullRequest
0 голосов
/ 02 февраля 2012

В настоящее время я создаю IDE, используя Scintilla для компонента Text. Но у автозаполнения есть проблема, которую я не могу исправить.

Я автоматически показываю список предложений после ввода. после имени объекта или класса.

Тогда я вызываю следующее:

int pos = _editor.NativeInterface.GetCurrentPos();
string word = _editor.GetWordFromPosition(pos - 1);
if (string.IsNullOrEmpty(word))
    return;
if (Objects.Keys.Contains(word))
{
    System.Reflection.MemberInfo[] memberInfos = Reflector.PublicMembersOf(Objects[word]);
    List<String> proposals = new List<string>();
    foreach (System.Reflection.MemberInfo mi in memberInfos)
    {
        string member = mi.ToString();
        if (Reflector.IsRealMethod(mi))
        proposals.Add(mi.ToString().Split(" ".ToCharArray(), 2)[1].Replace(" ", ""));
    }
    proposals.Sort();
    _editor.AutoComplete.Show(0, proposals);
}

Objects - это HashMap<String, Type>, где хранятся все объекты и соответствующие им типы.

Когда я вызываю автозаполнение в первый раз, оно работает нормально. Но используя его во второй раз, мы просто автоматически заполняем первый элемент proposals.

1 Ответ

1 голос
/ 30 апреля 2012

Я думаю, что проблема в том, что вы пытаетесь использовать открытое автозаполнение после '.' условное обозначение. Как вы можете заметить, автозаполнение будет закрыто после того, как вы введете «.» или '(' и выберите текущее слово в результате автозаполнения. Мне нужно было сделать то же самое: открыть список автозаполнения после '.' условное обозначение. Решение очень простое, вы можете открыть его через 10 миллисекунд. Например используйте этот код:

    private void scintillaCs_CharAdded(object sender, ScintillaNET.CharAddedEventArgs e)
    {
        ScintillaNET.Scintilla editor = sender as ScintillaNET.Scintilla;

        if (e.Ch == '.')
        {
            Timer t = new Timer();

            t.Interval = 10;
            t.Tag = editor;
            t.Tick += new EventHandler((obj, ev) =>
            {
                // make a new autocomplete list if needed
                List<string> s = new List<string>();
                s.Add("test");
                s.Add("test2");
                s.Add("test3");
                s.Sort(); // don't forget to sort it

                editor.AutoComplete.ShowUserList(0, s);

                t.Stop();
                t.Enabled = false;
                t.Dispose();
            });
            t.Start();
        }
    }
}
...