private void DoNickCompletion() { int start = 0, end = 0; if (txtInput.Text.Length > 0) { start = Math.Max(0, txtInput.CaretIndex - 1); end = start < txtInput.Text.Length ? start + 1 : start; while (start >= 0 && NicknameItem.IsNickChar(txtInput.Text[start])) { start--; } start++; while (end < txtInput.Text.Length && NicknameItem.IsNickChar(txtInput.Text[end])) { end++; } } else { start = end = 0; } if (end - start > 0) { string nickPart = txtInput.Text.Substring(start, end - start); string nextNick = null; if (_nickCandidates == null) { _nickCandidates = (from n in this.Nicknames where n.Nickname.StartsWith(nickPart, StringComparison.InvariantCultureIgnoreCase) orderby n.Nickname.ToLowerInvariant() select n.Nickname).ToArray(); if (_nickCandidates.Length > 0) { nextNick = _nickCandidates[0]; } } for (int i = 0; i < _nickCandidates.Length; i++) { if (string.Compare(_nickCandidates[i], nickPart, StringComparison.InvariantCulture) == 0) { nextNick = i < _nickCandidates.Length - 1 ? _nickCandidates[i + 1] : _nickCandidates[0]; break; } } var keepNickCandidates = _nickCandidates; if (nextNick != null) { txtInput.Text = txtInput.Text.Substring(0, start) + nextNick + txtInput.Text.Substring(end); txtInput.CaretIndex = start + nextNick.Length; } _nickCandidates = keepNickCandidates; } }
private void AddNick(ChannelLevel level, string nick) { this.RemoveNick(nick); var cn = new NicknameItem(level, nick); int count = this.Nicknames.Count; if (count == 0 || cn.CompareTo(this.Nicknames[count - 1]) >= 0) { this.Nicknames.Add(cn); } else { int i; for (i = 0; i < this.Nicknames.Count; i++) { if (cn.CompareTo(this.Nicknames[i]) < 0) { break; } } this.Nicknames.Insert(i, cn); } }