/// <summary> /// 段落番号を初期化する /// </summary> private void BuildUpHeaderNumbers() { this.HeaderNumbers.Clear(); int selectStart = base.SelectionStart; int linestart = 0; for (int line = 0; line < base.Lines.Length; line++) { string lineStr = base.Lines[line]; base.SelectionStart = linestart; base.SelectionLength = lineStr.Length; lineStr = lineStr.TrimEnd(' '); base.SelectedText = lineStr; string headerNumberStr = base.Lines[line].GetHeaderNumber(); HeaderNumber headerNumber = new HeaderNumber(); headerNumber.SetHeaderNumber(headerNumberStr); this.HeaderNumbers.Add(headerNumber); base.SelectionStart = linestart; base.SelectionLength = headerNumberStr.Length; base.SelectionBackColor = Color.Yellow; linestart += base.Lines[line].Length + 1; } base.SelectionStart = selectStart; base.SelectionLength = 0; }
/// <summary> /// 段落番号を更新する /// </summary> /// <param name="startLine">開始行No</param> private void UpdateHeaderNumberAdd(int startLine) { HeaderNumber thisHeaderNumber = this.HeaderNumbers[startLine]; bool isRoot = base.Lines[startLine].IsRootHeaderNumber(); int currNumber = thisHeaderNumber.LastHeaderNumber(); int currSubNumber = 1; int linestart = 0; for (int i = 0; i < startLine; i++) { linestart += base.Lines[i].Length + 1; } base.SelectionStart = linestart; base.SelectionLength = base.Lines[startLine].GetHeaderNumber().Length; base.SelectedText = thisHeaderNumber.GetHeaderNumber(); linestart += base.Lines[startLine].Length + 1; for (int i = startLine + 1; i < base.Lines.Length; i++) { string lineStr = base.Lines[i]; HeaderNumber curHeaderNumber = this.HeaderNumbers[i]; if (curHeaderNumber.HeaderNumberDeep == -1) { linestart += lineStr.Length + 1; continue; } if (curHeaderNumber.HeaderNumberDeep < thisHeaderNumber.HeaderNumberDeep) { break; } for (int j = 0; j < thisHeaderNumber.HeaderNumberDeep; j++) { curHeaderNumber.UpdateHeaderNumber(j, thisHeaderNumber.IndexHeaderNumber(j)); } if (curHeaderNumber.HeaderNumberDeep == thisHeaderNumber.HeaderNumberDeep) { curHeaderNumber.UpdateHeaderNumber(thisHeaderNumber.HeaderNumberDeep, currNumber + 1); currNumber += 1; currSubNumber = 1; } else { curHeaderNumber.UpdateHeaderNumber(thisHeaderNumber.HeaderNumberDeep, currNumber); if (curHeaderNumber.HeaderNumberDeep == thisHeaderNumber.HeaderNumberDeep + 1) { curHeaderNumber.UpdateHeaderNumber(thisHeaderNumber.HeaderNumberDeep + 1, currSubNumber); currSubNumber += 1; } } base.SelectionStart = linestart; base.SelectionLength = lineStr.GetHeaderNumber().Length; base.SelectedText = curHeaderNumber.GetHeaderNumber(); linestart += base.Lines[i].Length + 1; } }
/// <summary> /// キーダウンイベント /// </summary> /// <param name="e">e</param> protected override void OnKeyDown(KeyEventArgs e) { #region "ティップス" // ティップスのフィルタと位置を調整する if (this.Controls.ContainsKey(CONTROL_KEY)) { // フォーカスは最初の位置の場合、処理をキャンセルする if (base.SelectionStart == 0) { return; } // ティップス TipsListBox lstTips = (TipsListBox)this.Controls[CONTROL_KEY]; if (e.KeyCode == Keys.Escape) { // ESCAPEの場合、ティップスを非表示にする lstTips.Hide(); this.Controls.Remove(lstTips); lstTips.Dispose(); } else if (e.KeyCode == Keys.Back) { // BACKの場合、ティップスを非表示にする base.SelectionStart -= 1; if (base.SelectionColor == Color.Blue) { lstTips.Hide(); this.Controls.Remove(lstTips); lstTips.Dispose(); } base.SelectionStart += 1; } else if (e.KeyCode == Keys.Enter) { if (lstTips.Visible) { e.Handled = true; } } else if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Tab) { // DOWN・TABの場合、ティップスをフォーカスする if (lstTips.Visible) { lstTips.Focus(); e.Handled = true; } } else if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right) { // UP・LEFT・RIGHTの場合、ティップスを非表示にする if (lstTips.Visible) { lstTips.Hide(); this.Controls.Remove(lstTips); lstTips.Dispose(); } } } #endregion #region "段落番号" // 段落番号の発番 if (_numberingFlg && !e.Handled && !string.IsNullOrEmpty(base.Text)) { int selectStart = base.SelectionStart; int line = base.GetLineFromCharIndex(selectStart); string lineStr = base.Lines[line]; // 選択行の開始インデックス int linestart = 0; for (int i = 0; i < line; i++) { linestart += base.Lines[i].Length + 1; } if (e.KeyCode == Keys.Enter) { // 当該行が空白以外の場合 if (!string.IsNullOrEmpty(lineStr)) { // 該当行の段落番号 string thisHeaderNumber = lineStr.GetHeaderNumber(); // 当該行は段落番号しかない場合、段落番号を更新する if (!string.IsNullOrEmpty(thisHeaderNumber) && (lineStr.Equals(thisHeaderNumber) || lineStr.Equals(thisHeaderNumber + StringUtil.FULLWIDTH_SPACE))) { HeaderNumber nextHeaderNumber = null; for (int i = line + 1; i < base.Lines.Length; i++) { if (this.HeaderNumbers[i].HeaderNumberDeep != -1) { nextHeaderNumber = this.HeaderNumbers[i]; break; } } if (nextHeaderNumber != null && nextHeaderNumber.HeaderNumberDeep > this.HeaderNumbers[line].HeaderNumberDeep) { e.Handled = true; return; } string parentNextHeaderNumber = lineStr.GetParentNextHeaderNumber(); this.HeaderNumbers[line].SetHeaderNumber(parentNextHeaderNumber); // 段落番号がルート番号の場合、前に改行する if (parentNextHeaderNumber.Length == 1) { this.HeaderNumbers.Insert(line, new HeaderNumber()); line += 1; parentNextHeaderNumber = NEW_LINE + parentNextHeaderNumber; } // 段落番号が空白以外の場合、最後に全角スペースを追加する if (!string.IsNullOrEmpty(parentNextHeaderNumber)) { parentNextHeaderNumber += StringUtil.FULLWIDTH_SPACE; } // 当該行のテキストをクリアする base.SelectionStart = linestart; base.SelectionLength = lineStr.Length; base.SelectedText = string.Empty; // 発番をリセットする base.SelectedText = parentNextHeaderNumber; linestart += parentNextHeaderNumber.Length; // 段落番号を更新する this.UpdateHeaderNumberAdd(line); // フォーカスを当該行の最後に移動する base.SelectionStart = linestart; base.SelectionLength = 0; e.Handled = true; } } } else if (e.KeyCode == Keys.Back) { if (selectStart == linestart) { base.SelectionStart = selectStart; base.SelectionLength = base.Lines[line].GetHeaderNumber().Length; base.SelectedText = string.Empty; base.SelectionLength = 0; this.HeaderNumbers.RemoveAt(line); } else { // 段落番号の場合、段落番号を削除する if (base.SelectionBackColor == Color.Yellow) { base.SelectionStart = linestart; base.SelectionLength = base.Lines[line].GetHeaderNumber().Length; base.SelectedText = string.Empty; base.SelectionLength = 0; e.Handled = true; int deep = this.HeaderNumbers[line].HeaderNumberDeep; this.HeaderNumbers[line].SetHeaderNumber(string.Empty); for (int i = line - 1; i >= 0; i--) { if (deep == this.HeaderNumbers[i].HeaderNumberDeep) { this.HeaderNumbers[line].SetHeaderNumber(this.HeaderNumbers[i].GetHeaderNumber()); this.UpdateHeaderNumberAdd(i); break; } else if (deep > 0 && deep == this.HeaderNumbers[i].HeaderNumberDeep + 1) { this.HeaderNumbers[line].SetHeaderNumber(this.HeaderNumbers[i].GetHeaderNumber() + ".1"); this.UpdateHeaderNumberAdd(line); break; } } base.SelectionStart = linestart + base.Lines[line].GetHeaderNumber().Length; } } } } #endregion }