Ejemplo n.º 1
0
        /// <summary>
        /// 指定したオプションから検索方向への次のオフセット位置を返す
        /// </summary>
        /// <param name="offset">現在のオフセット位置</param>
        /// <param name="endOffset">一番最後のオフセット位置</param>
        /// <param name="option">検索方向を含むオプション</param>
        /// <returns>次のオフセット位置 次がないときは-1を返す</returns>
        private static int getNextSearchOffset(int offset, int endOffset, EditorSearchOption option)
        {
            int ret = -1;

            if (option.Direction == SearchDirection.Down)
            {
                ret = offset + 1;
                if (ret > endOffset - option.SearchKeyword.Length)
                {
                    //最後を超えている
                    ret = -1;
                }
            }
            else if (option.Direction == SearchDirection.Up)
            {
                ret = offset - 1;
                if (ret < 0)
                {
                    //最初を超えている
                    ret = -1;
                }
            }

            return(ret);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 検索する正規表現のオプションを作成し返す
        /// </summary>
        /// <param name="option"></param>
        /// <returns></returns>
        private static RegexOptions getSearchRegexOptions(EditorSearchOption option)
        {
            RegexOptions regOption = RegexOptions.Multiline;

            if (option.IgnoreCase)
            {
                if (option.Direction == SearchDirection.Down)
                {
                    regOption = RegexOptions.Multiline;
                }
                else if (option.Direction == SearchDirection.Up)
                {
                    regOption = RegexOptions.RightToLeft | RegexOptions.Multiline;
                }
            }
            else
            {
                if (option.Direction == SearchDirection.Down)
                {
                    regOption = RegexOptions.Multiline | RegexOptions.IgnoreCase;
                }
                else if (option.Direction == SearchDirection.Up)
                {
                    regOption = RegexOptions.RightToLeft | RegexOptions.Multiline | RegexOptions.IgnoreCase;
                }
            }

            return(regOption);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// 検索を行う
 /// </summary>
 /// <param name="option"></param>
 public void Search(EditorSearchOption option)
 {
     if (ActiveEditor != null)
     {
         ActiveEditor.Search(option);
         //ActiveEditor.MarkSearchString(option);
     }
 }
Ejemplo n.º 4
0
        /// <summary>
        /// 指定した文字列を検索しその行のテキストを選択状態にする
        /// </summary>
        /// <param name="searchText">検索する文字列</param>
        public void MoveCaretLineSelectText(EditorSearchOption searchOption)
        {
            EditorSearchResult result = this.Search(searchOption);

            if (result != null && result.IsHit)
            {
                Point p = this.Document.OffsetToPosition(result.Offset);
                MoveCaretLine(p.Y);
                SelectText(p.Y);
            }
        }
Ejemplo n.º 5
0
 /// <summary>
 /// 置換を行う
 /// </summary>
 /// <param name="editorSearchOption">検索オプション</param>
 public void Replace(EditorSearchOption option)
 {
     if (ActiveEditor != null)
     {
         EditorSearchResult ret = ActiveEditor.Search(option);
         if (ret != null && ret.IsHit == true)
         {
             ActiveEditor.ReplaceSelectedText(option);
         }
     }
 }
Ejemplo n.º 6
0
        /// <summary>
        /// 検索開始のオフセット位置をセットする
        /// </summary>
        /// <param name="offset">現在のオフセット位置</param>
        /// <param name="option"></param>
        /// <returns></returns>
        private static int getFirstSearchOffset(int offset, EditorSearchOption option)
        {
            int ret = -1;

            if (option.Direction == SearchDirection.Down)
            {
                ret = offset - 1;                       //一つ上から開始する
            }
            else if (option.Direction == SearchDirection.Up)
            {
                ret = offset;                           //同じ位置から開始する
            }

            return(ret);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 全置換を行う
        /// </summary>
        /// <param name="editorSearchOption"></param>
        public void ReplaceAll(EditorSearchOption option)
        {
            if (ActiveEditor != null)
            {
                ReplaceAllForm repallForm = new ReplaceAllForm();
                repallForm.Show(ActiveEditorForm);

                int count = 0;                  //置換個数
                ActiveEditor.MoveCaretLine(0);  //先頭に移動
                while (true)
                {
                    Application.DoEvents();
                    if (repallForm.Cancel)
                    {
                        util.Msgbox.Warning("全置換を中止しました");
                        return;                         //強制中断
                    }

                    EditorSearchResult ret = ActiveEditor.Search(option, false);                        //検索する(見つからなくてもエラーを表示しない)
                    if (ret == null || ret.IsHit == false)
                    {
                        break;                          //もう見つかる物がなくなったのでループ終了
                    }

                    if (ActiveEditor.ReplaceSelectedText(option) == false)
                    {
                        break;                          //置換に失敗したのでループ終了
                    }
                    count++;
                    repallForm.SetReplaceCount(count);
                }
                if (repallForm.Cancel == false)
                {
                    repallForm.Close();                         //キャンセルしていないときは閉じる
                }

                //全検索が終了したとき
                if (count == 0)
                {
                    util.Msgbox.Warning(String.Format("検索文字が見つかりませんでした"));
                }
                else
                {
                    util.Msgbox.Info(String.Format("{0} 個の置換を行いました", count));
                }
            }
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 次を検索し見つかったときは位置を返す
        /// </summary>
        /// <param name="option">検索オプション</param>
        /// <param name="startOffset">検索開始位置</param>
        /// <param name="buffer">検索する文字列バッファ</param>
        /// <returns>見つかった位置</returns>
        public static EditorSearchResult SearchNext(EditorSearchOption option, int startOffset, ITextBufferStrategy buffer)
        {
            EditorSearchResult result = null;

            if (option.Regex)
            {
                //正規表現で検索
                result = getSearchPosRegex(option, startOffset, buffer);
            }
            else
            {
                //通常の文字列として検索
                result = getSearchPosString(option, startOffset, buffer);
            }

            return(result);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 現在選択している文字列を置換する
        /// </summary>
        /// <param name="option">置換するオプション情報</param>
        /// <returns>置換したときはtrue</returns>
        public bool ReplaceSelectedText(EditorSearchOption option)
        {
            int offset = this.ActiveTextArea.Caret.Offset;

            if (this.ActiveTextArea.SelectionManager.IsSelected(offset) == false)
            {
                //選択されていないときは何もしない
                return(false);
            }

            ISelection sel = this.ActiveTextArea.SelectionManager.GetSelectionAt(offset);

            this.Document.Replace(sel.Offset, sel.Length, option.ReplaceKeyword);                                           //置換する
            this.ActiveTextArea.Caret.Position = this.Document.OffsetToPosition(sel.Offset + option.ReplaceKeyword.Length); //カーソル位置をセットする
            this.ActiveTextArea.SelectionManager.ClearSelection();                                                          //選択解除
            return(true);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 検索情報を指定しカーソルを移動する
        /// </summary>
        /// <param name="filePath"></param>
        /// <param name="searchOption"></param>
        /// <returns></returns>
        public IEditorDocContent LoadFile(string filePath, EditorSearchOption searchOption)
        {
            if (FileType.GetKrkrType(filePath) == FileType.KrkrType.Screen)
            {
                //指定行へ移動できないためnullを返す
                return(null);
            }

            EditorForm editor = (EditorForm)LoadFile(filePath);

            if (editor == null)
            {
                return(null);
            }

            //editor.TextEditor.MoveCaretLineSelectText(lineNumber);
            editor.TextEditor.MoveCaretLineSelectText(searchOption);
            return(editor);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 正規表現検索を行い、ヒットした位置を返す
        /// </summary>
        /// <param name="option"></param>
        /// <returns></returns>
        private static EditorSearchResult getSearchPosRegex(EditorSearchOption option, int offset, ITextBufferStrategy buffer)
        {
            EditorSearchResult result = new EditorSearchResult();
            Regex regex = new Regex(option.SearchKeyword, getSearchRegexOptions(option));

            Match match = regex.Match(buffer.GetText(0, buffer.Length), offset);

            while (match.Success)
            {
                if (option.WordUnit == false || isSearchWholeWordAt(buffer, match.Index, match.Value.Length))
                {
                    result.Offset = match.Index;
                    result.Length = match.Value.Length;
                    break;
                }

                match = match.NextMatch();
            }

            return(result);
        }
Ejemplo n.º 12
0
        public void MarkSearchString(EditorSearchOption option, ITextBufferStrategy buffer)
        {
            int offset = 0;
            EditorSearchResult result = null;

            while (true)
            {
                result = util.TextUtil.SearchNext(option, offset, buffer);
                if (result == null || result.IsHit == false)
                {
                    //ループを抜ける
                    break;
                }

                this.Document.MarkerStrategy.AddMarker(new TextMarker(result.Offset, result.Length, TextMarkerType.SolidBlock, Color.Red));
                offset = result.Offset + result.Length;
            }

            //更新
            this.Refresh();
        }
Ejemplo n.º 13
0
        /// <summary>
        /// 文字列検索を行いヒットした位置を返す
        /// </summary>
        /// <param name="option">検索オプション</param>
        /// <returns>ヒットした位置</returns>
        private static EditorSearchResult getSearchPosString(EditorSearchOption option, int offset, ITextBufferStrategy buffer)
        {
            EditorSearchResult result = new EditorSearchResult();

            offset = getFirstSearchOffset(offset, option);

            //検索キーワードの設定
            string keyword;

            if (option.IgnoreCase)
            {
                keyword = option.SearchKeyword;
            }
            else
            {
                keyword = option.SearchKeyword.ToUpper();
            }

            //一つづつオフセットをずらしていきヒットするまで続ける
            while ((offset = getNextSearchOffset(offset, buffer.Length, option)) != -1)
            {
                if (matchCaseString(buffer, offset, keyword, option.IgnoreCase))
                {
                    if (option.WordUnit == false || isSearchWholeWordAt(buffer, offset, keyword.Length))
                    {
                        result.Offset = offset;
                        break;
                    }
                }
            }
            if (offset == -1)
            {
                //ヒットしなかったとき
                result.Offset = -1;
            }

            result.Length = option.SearchKeyword.Length;
            return(result);
        }
Ejemplo n.º 14
0
        /// <summary>
        /// 現在のカーソル位置にある定義(KAGのときはタグ・マクロ、TJSのときはクラス・関数)をGrep検索する
        /// </summary>
        public void SearchGrepReferenceDefineFromCaret()
        {
            switch (FileType.GetKrkrType(this.FileName))
            {
            //KAGファイルの時はタグ・マクロ定義をGrep検索する
            case FileType.KrkrType.Kag:
                //カーソル位置のKAGタグ情報を取得する
                int            colNum = GetKagTagEndFormCaret();
                KagTagKindInfo info   = KagUtility.GetTagKind(Document, this.ActiveTextArea.Caret.Line, colNum);
                if (info == null)
                {
                    util.Msgbox.Error("タグ・マクロのある位置にカーソルが無いため検索できません");
                    return;
                }

                string searchText = "";
                searchText = String.Format("\\[{0}|^\\t*@{0}", info.TagName);

                //Grep検索用オプションをセットする
                EditorSearchOption searchOption = new EditorSearchOption();
                searchOption.SearchKeywordTable.Add(searchText);
                searchOption.Regex          = true;
                searchOption.Type           = SearchType.Grep;
                searchOption.GrepOption.Pos = GrepPotision.Project;
                searchOption.GrepOption.FileExtTable.Add("*.ks");
                searchOption.GrepOption.UseSubFolder = true;
                GlobalStatus.FormManager.SearchResultForm.Show(GlobalStatus.FormManager.MainForm.MainDockPanel);
                GlobalStatus.FormManager.SearchResultForm.Grep(searchOption);                           //検索開始
                break;

            //TJSファイルの時は関数・クラス定義をGrep検索する
            case FileType.KrkrType.Tjs:
                //未実装
                break;
            }
        }
Ejemplo n.º 15
0
        /// <summary>
        /// 指定した検索を行い、見つかった文字列を選択状態にする
        /// </summary>
        /// <param name="option">検索するオプション</param>
        /// <param name="showErrorMsg">エラーメッセージを表示するかどうか(trueかつオプションでもtrueのとき表示する)</param>
        /// <returns>見つかった位置</returns>
        public EditorSearchResult Search(EditorSearchOption option, bool showErrorMsg)
        {
            Point caretBackup = this.ActiveTextArea.Caret.Position;

            if (option.HeadStart)
            {
                this.ActiveTextArea.Caret.Position = new Point(0, 0);                   //先頭へ移動
            }
            int offset = this.ActiveTextArea.Caret.Offset;

            if (this.ActiveTextArea.SelectionManager.IsSelected(offset))
            {
                ISelection sel = this.ActiveTextArea.SelectionManager.GetSelectionAt(offset);

                //選択しているときはカーソル位置をそれぞれ次を探せる位置へカーソルを移動する
                switch (option.Direction)
                {
                case SearchDirection.Up:
                    this.ActiveTextArea.Caret.Position = sel.StartPosition;
                    break;

                case SearchDirection.Down:
                    this.ActiveTextArea.Caret.Position = sel.EndPosition;
                    break;
                }

                this.ActiveTextArea.SelectionManager.ClearSelection();          //選択を解除する
                offset = this.ActiveTextArea.Caret.Offset;                      //新しいオフセット位置をセットする
            }

            //検索開始
            EditorSearchResult result = null;

            try
            {
                result = util.TextUtil.SearchNext(option, offset, this.Document.TextBufferStrategy);
            }
            catch (Exception err)
            {
                util.Msgbox.Error("検索キーワードが正しくありません\n" + err.Message);
            }

            //見つからなかったときの処理
            if (result == null || result.IsHit == false)
            {
                //見つからなかったときは何もしない
                if (showErrorMsg && global.GlobalStatus.EnvOption.SearchResultShowDiaglog)
                {
                    String text = "";
                    if (option.Direction == SearchDirection.Up)
                    {
                        text = "上方向";
                    }
                    else
                    {
                        text = "下方向";
                    }
                    text += "に検索文字列が見つかりませんでした";
                    util.Msgbox.Info(text);
                }

                if (option.HeadStart)
                {
                    this.ActiveTextArea.Caret.Position = caretBackup;                           //見つからなかったときは選択位置を元に戻す
                }
                return(null);
            }

            //ヒットした文字列を選択状態にする
            this.SelectText(result.Offset, result.Offset + result.Length);
            return(result);
        }
Ejemplo n.º 16
0
 /// <summary>
 /// 指定した検索を行い、見つかった文字列を選択状態にする
 /// </summary>
 /// <param name="option">検索するオプション</param>
 /// <returns>見つかった位置</returns>
 public EditorSearchResult Search(EditorSearchOption option)
 {
     return(Search(option, true));
 }
Ejemplo n.º 17
0
        /// <summary>
        /// 現在のカーソル位置からシナリオファイル・ラベルの指定が存在するときはジャンプする
        /// </summary>
        public void JumpKagScenarioLabelFromCaret()
        {
            switch (FileType.GetKrkrType(this.FileName))
            {
            case FileType.KrkrType.Kag:                         //KAGファイルのとき
                //カーソル位置のKAGタグ情報を取得する
                int            colNum = GetKagTagEndFormCaret();
                KagTagKindInfo info   = KagUtility.GetTagKind(Document, this.ActiveTextArea.Caret.Line, colNum);
                if (info == null)
                {
                    util.Msgbox.Error("タグ・マクロのある位置にカーソルが無いため移動できません");
                    return;
                }

                //ジャンプ先情報をKLAGタグ情報から取得する
                string storage;
                string target;
                info.AttrTable.TryGetValue("storage", out storage);
                info.AttrTable.TryGetValue("target", out target);
                if (storage == null && target == null)
                {
                    Debug.WriteLine("ジャンプ指定(storage or target)がない");
                    util.Msgbox.Error("ジャンプ指定属性が無いため移動できません");
                    return;
                }

                //ファイルのフルパスを取得
                if (storage == null)
                {
                    storage = this.FileName;
                }
                else
                {
                    if (GlobalStatus.Project == null || Directory.Exists(GlobalStatus.Project.DataFullPath) == false)
                    {
                        return;                                 //検索パスが不明
                    }
                    string[] files = Directory.GetFiles(GlobalStatus.Project.DataFullPath, storage, SearchOption.AllDirectories);
                    if (files == null || files.Length == 0)
                    {
                        util.Msgbox.Error(storage + "が見つからないため移動できません");
                        return;                                 //ファイルが見つからない
                    }

                    storage = files[0];                                 //見つかったファイルパスをセットする
                }

                //ラベルをセットしファイルを開く
                if (target == null)
                {
                    GlobalStatus.EditorManager.LoadFile(storage);                               //ファイルを開くだけ
                }
                else
                {
                    //ラベルを検索するようにファイルを開く
                    EditorSearchOption searchOption = new EditorSearchOption();
                    searchOption.HeadStart = true;
                    searchOption.Direction = SearchDirection.Down;
                    searchOption.Regex     = true;
                    searchOption.SearchKeywordTable.Add("^\\t*\\" + target);
                    GlobalStatus.EditorManager.LoadFile(storage, searchOption);
                }

                Debug.WriteLine(String.Format("JumpScenarioLabelFromCaret: storage={0}, target={1}", storage, target));
                break;
            }
        }
Ejemplo n.º 18
0
 public void HightrightSearchString(EditorSearchOption option)
 {
 }