Exemple #1
0
        /// <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;
        }
Exemple #2
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;
            }
        }
Exemple #3
0
        /// <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
        }