Exemplo n.º 1
0
        }     // end sub

        public override void ReplaceSelectionWords(Action <TextActionsParameters> prepare, Action <TextActionsParameters> act)
        {
            // 引数の検証
            // prepare は null で構いません。
            if (act == null)
            {
                throw new ArgumentNullException("act");
            }

            // アクティブドキュメントがない場合は例外
            if (this.Dte == null || this.Dte.ActiveDocument == null)
            {
                throw new ActiveDocumentIsNullException();
            }

            var activeSelection = this.Dte.ActiveDocument.Selection as EnvDTE.TextSelection;

            // 選択範囲が無いときは、カーソルの左の単語を選択します。
            if (activeSelection.IsEmpty)
            {
                activeSelection.WordLeft();
                activeSelection.WordRight(true);
            } // end if

            // 選択範囲に対してカレントマクロを実行します。
            var a = new TextActionsParameters();

            a.Text = activeSelection.Text;
            if (prepare != null)
            {
                prepare(a);
            }

            a.Text = activeSelection.Text;
            var endWithSpace = a.Text.EndsWith(" ");

            a.IsCanceled = false;
            act(a);

            if (a.IsCanceled == false)
            {
                activeSelection.Insert(a.Text + (endWithSpace ? " " : ""), (int)vsInsertFlags.vsInsertFlagsContainNewText);
                this.Dte.ActiveDocument.Activate();
            } // end if
        }     // end sub
Exemplo n.º 2
0
        public override void ReplaceSelectionParagraphs(Action <TextActionsParameters> prepare, Action <TextActionsParameters> act)
        {
            // 引数の検証
            // prepare は null で構いません。
            if (act == null)
            {
                throw new ArgumentNullException("act");
            }

            // アクティブドキュメントがない場合は例外
            if (this.Dte == null || this.Dte.ActiveDocument == null)
            {
                throw new ActiveDocumentIsNullException();
            }

            var activeSelection = this.Dte.ActiveDocument.Selection as EnvDTE.TextSelection;

            if (activeSelection.IsEmpty)
            {
                // 選択範囲が無いときは、行を選択します(最後の改行を含めないために、カーソル移動をエミュレートします)。
                activeSelection.StartOfLine();
                activeSelection.EndOfLine(true);
            }
            else
            {
                // 選択範囲があるときは、先頭と末尾の選択範囲を、行頭と行末に拡張します。
                // ただし選択範囲の末尾が行頭の場合は、その行を含まないようにします。
                var lineTop               = activeSelection.TopPoint.Line;
                var lineBottom            = activeSelection.BottomPoint.Line;
                var bottomIsAtStartOfLine = activeSelection.BottomPoint.AtStartOfLine;

                activeSelection.MoveToLineAndOffset(lineTop, 1);

                if (bottomIsAtStartOfLine)
                {
                    activeSelection.MoveToLineAndOffset(lineBottom - 1, 1, true);
                }
                else
                {
                    activeSelection.MoveToLineAndOffset(lineBottom, 1, true);
                } // end if

                activeSelection.EndOfLine(true);
            } // end if

            // 選択範囲の行毎に、カレントマクロを実行します。
            var a       = new TextActionsParameters();
            var oldText = activeSelection.Text;
            var lines   = oldText.Replace("\r\n", "\n").Split('\n');

            if (prepare != null)
            {
                foreach (var line in lines)
                {
                    a.Text = line;
                    prepare(a);
                } // next line
            }     // end if

            var  result  = new StringBuilder();
            bool isFirst = true;

            foreach (var line in lines)
            {
                a.Text       = line;
                a.IsCanceled = false;

                act(a);

                if (isFirst == false)
                {
                    result.Append("\r\n");
                }

                if (a.IsCanceled == false)
                {
                    result.Append(a.Text);
                }
                else
                {
                    result.Append(line);
                } // end if

                isFirst = false;
            } // next line

            activeSelection.Insert(result.ToString(), (int)vsInsertFlags.vsInsertFlagsContainNewText);
            this.Dte.ActiveDocument.Activate();
        } // end sub