/*
         *  マウスホイールが回った。
         */
        private void CoreWindow_PointerWheelChanged(CoreWindow sender, PointerEventArgs args)
        {
            int scroll_direction = (0 < args.CurrentPoint.Properties.MouseWheelDelta ? -1 : 1);
            int offset           = (int)Math.Round(EditScroll.VerticalOffset / LineHeight);

            EditScroll.ScrollToVerticalOffset((offset + scroll_direction) * LineHeight);
            Debug.WriteLine("<<--- PointerWheelChanged {0}", args.CurrentPoint.Properties.MouseWheelDelta);
        }
        /*
         *  テキストの選択位置を変更します。
         */
        void ChangeSelection(KeyEventArgs e)
        {
            int old_sel_current = SelCurrent;
            int new_sel_current = SelCurrent;
            int current_line_top;
            int next_line_top;

            switch (e.VirtualKey)
            {
            case VirtualKey.Left: // 左矢印(←)
                if (0 < SelCurrent)
                {
                    // 文書の最初でない場合

                    // 新しい選択位置
                    new_sel_current = SelCurrent - 1;
                }
                break;

            case VirtualKey.Right: // 右矢印(→)
                if (SelCurrent < Chars.Count)
                {
                    // 文書の最後でない場合

                    // 新しい選択位置
                    new_sel_current = SelCurrent + 1;
                }
                break;

            case VirtualKey.Up: { // 上矢印(↑)
                // 現在の行の先頭位置を得ます。
                current_line_top = GetLineTop(SelCurrent);

                if (current_line_top != 0)
                {
                    // 現在の行の先頭が文書の最初でない場合

                    // 直前の行の先頭位置を得ます。
                    int prev_line_top = GetLineTop(current_line_top - 2);

                    // 直前の行の文字数
                    int prev_line_len = (current_line_top - 1) - prev_line_top;

                    // 行の先頭からの位置
                    int col = Math.Min(prev_line_len, SelCurrent - current_line_top);

                    // 新しい選択位置
                    new_sel_current = prev_line_top + col;
                }
            }
            break;

            case VirtualKey.Down: { // 下矢印(↓)
                // 現在の行の先頭位置を得ます。
                current_line_top = GetLineTop(SelCurrent);

                // 次の行の先頭位置を得ます。
                next_line_top = GetNextLineTop(SelCurrent);

                if (next_line_top != -1)
                {
                    // 次の行がある場合


                    // 次の次の行の先頭位置を得ます。
                    int next_next_line_top = GetNextLineTop(next_line_top);

                    // 次の行の文字数
                    int next_line_len;

                    if (next_next_line_top == -1)
                    {
                        // 次の次の行がない場合(次の行が文書の最後の場合)

                        next_line_len = Chars.Count - next_line_top;
                    }
                    else
                    {
                        // 次の次の行がある場合

                        next_line_len = next_next_line_top - 1 - next_line_top;
                    }

                    // 行の先頭からの位置
                    int col = Math.Min(next_line_len, SelCurrent - current_line_top);

                    // 新しい選択位置
                    new_sel_current = next_line_top + col;
                }
            }
            break;

            case VirtualKey.Home:
                if ((Window.Current.CoreWindow.GetKeyState(VirtualKey.Control) & CoreVirtualKeyStates.Down) != 0)
                {
                    // Controlキーが押されている場合

                    // 新しい選択位置
                    new_sel_current = 0;
                }
                else
                {
                    // Controlキーが押されてない場合

                    // 現在の行の先頭位置を得ます。
                    new_sel_current = GetLineTop(SelCurrent);
                }
                break;

            case VirtualKey.End:
                if ((Window.Current.CoreWindow.GetKeyState(VirtualKey.Control) & CoreVirtualKeyStates.Down) != 0)
                {
                    // Controlキーが押されている場合

                    // 文書の最後の位置
                    new_sel_current = Chars.Count;
                }
                else
                {
                    // Controlキーが押されてない場合

                    // 現在の行の最終位置を得ます。
                    new_sel_current = GetLineEnd(SelCurrent);
                }
                break;

            case VirtualKey.PageUp: {
                int line_diff = 0;
                for (int i = SelCurrent; 0 < i; i--)
                {
                    if (Chars[i].Chr == LF)
                    {
                        line_diff++;
                        if (ViewLineCount <= line_diff)
                        {
                            int line_idx = GetLFCount(0, i);
                            Debug.WriteLine("PageUp {0}", line_diff);
                            new_sel_current = i;
                            EditScroll.ScrollToVerticalOffset(Math.Min(EditCanvas.Height, line_idx * LineHeight));
                            break;
                        }
                    }
                }
            }
            break;

            case VirtualKey.PageDown: {
                int line_diff = 0;
                for (int i = SelCurrent; i < Chars.Count; i++)
                {
                    if (Chars[i].Chr == LF)
                    {
                        line_diff++;
                        if (ViewLineCount <= line_diff)
                        {
                            int line_idx = GetLFCount(0, i);
                            Debug.WriteLine("PageDown {0}", line_diff);
                            new_sel_current = i;
                            EditScroll.ScrollToVerticalOffset(Math.Min(EditCanvas.Height, line_idx * LineHeight));
                            break;
                        }
                    }
                }
            }
            break;
            }

            // 新しい現在の選択位置をセットします。
            SetSelection(new_sel_current);
        }