/* * マウスホイールが回った。 */ 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); }