あんにんにっき。

日々思ったことや、おこったことを記録するブログ。要するに日記。

twitterでの@補完の実験。

 .NetFrameworkだと、AutoCompleteをTextBoxに対してプロパティで簡単に設定できるようす。候補のリストも、FileSystemとかAllUrlとか選択できてしまうし、CustomSourceとかも選択できる(その場合は、指定のコレクションを渡すことができる)。
 が、こいつはどうやら大文字小文字の区別をきちんとしてくれないっぽい?
 ま、そんなこんなあったので、結局独自に実装するべく実験してみた。
 List screen_name を初期化して、中にユーザーIDを入れておく。
 すると、
 tw ほげほげ @an
 くらいまで入力すると、
 tw ほげほげ @annin102
 まで補完してくれるという感じ。
 ただ、これだけだと何の役にも立たない。twitterに向けて文章を送信するための仕組みが必要。
 これのが大変っちゃ大変。
 ちなみに、私のTwitter IDは http://twitter.com/annin102

        String part = "";
        int textLengthOld = 0;
        List<String> screen_names;

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text.Length < textLengthOld)
            {
                textLengthOld = textBox1.Text.Length;
                return;
            }
            String text = textBox1.Text;

            // 開始がtwの場合補完の対象。
            if (text.StartsWith("tw "))
            {
                // 行末が、@ + screen_name 候補の場合は補完を試みる。
                System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("@[0-9a-zA-Z_]+$");
                if (reg.Match(text).Success)
                {
                    String[] splited = text.Split('@');
                    part = splited[splited.Length - 1];

                    List<String> matchList = screen_names.FindAll(isPartOfScreenName);
                    if (matchList.Count == 1)
                    {
                        textBox1.Text = text.Substring(0, textBox1.Text.Length - part.Length) + matchList[0] + " ";
                    }
                    textBox1.Select(textBox1.Text.Length, 0);
                }
            }
        }

        private Boolean isPartOfScreenName(String s)
        {
            if (s.StartsWith(part))
                return true;
            else
                return false;
        }