/// <summary> /// 属性名リストを取得する /// </summary> /// <param name="info">現在位置の入力情報</param> /// <param name="macroList">マクロ情報リスト</param> /// <returns>マクロ名リスト</returns> public static KagMacroAttr GetKagMacroAttr(string attrName, KagTagKindInfo info, KagMacro[] macroList) { //マクロを取得 KagMacro macro = KagUtility.GetKagMacro(info.TagName, macroList); if (macro == null) { return(null); //マクロが見つからない } //属性を取得 Dictionary <string, KagMacroAttr> table = new Dictionary <string, KagMacroAttr>(); table = getAttrNameListFromMacro(macro, macroList, table, 0); //属性を検索する KagMacroAttr attr = null; if (table.ContainsKey(attrName)) { attr = table[attrName]; } return(attr); }
/// <summary> /// KAGタグの情報をエディタドキュメント情報から取得し返す /// </summary> /// <param name="document">エディタのドキュメント情報</param> /// <param name="lineNumber">行番号</param> /// <param name="colNumber">カーソル位置を表す桁番号</param> /// <returns>KAGタグ情報(見つからなかったときはnullを返す)</returns> public static KagTagKindInfo GetTagKind(IDocument document, int lineNumber, int colNumber) { if (document == null) { return(null); //ドキュメントがないとき } LineSegment lineSeg = document.GetLineSegment(lineNumber); if (lineSeg == null) { return(null); //情報が無いとき } string lineText = document.GetText(lineSeg); if (colNumber < lineText.Length) { lineText = lineText.Substring(0, colNumber); } if (KagUtility.ExistLineHead(lineText, ';')) { return(null); //コメント行のとき } if (KagUtility.ExistLineHead(lineText, '*')) { return(null); //ラベル行のとき } KagTagKindInfo info = KagUtility.GetTagKind(lineText); return(info); }
/// <summary> /// 現在のカーソル位置からKAGタグ・マクロ/TJSクラス・関数の定義場所へ遷移する /// </summary> public void JumpDefineFuncFromCaret() { switch (FileType.GetKrkrType(this.FileName)) { //KAGファイルの時はタグ・マクロ定義元へジャンプする 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; } //KAGタグ情報からマクロ情報を取得する KagMacro macro = KagUtility.GetKagMacro(info.TagName); if (macro == null) { //タグ情報が取得できなかった util.Msgbox.Error("タグ・マクロの情報が取得できませんでした"); return; } GlobalStatus.EditorManager.LoadFile(macro.FilePath, macro.LineNumber); break; //TJSファイルの時は関数・クラス定義元へジャンプする case FileType.KrkrType.Tjs: //未実装 break; } }
/// <summary> /// ツールチップで表示するテキストを取得する /// </summary> /// <param name="document"></param> /// <param name="lineNumber"></param> /// <param name="colNumber"></param> /// <returns></returns> public static string GetText(IDocument document, int lineNumber, int colNumber) { if (document == null) { return(null); //ドキュメントがないとき } string tip = ""; string word = TextUtilities.GetWordAt(document, document.PositionToOffset(new Point(colNumber, lineNumber))); KagTagKindInfo info = KagUtility.GetTagKind(document, lineNumber, colNumber); if (info == null) { return(""); //取得できなかった } switch (info.Kind) { case KagCompletionData.Kind.KagTagName: tip = getTagComment(word); break; case KagCompletionData.Kind.AttrName: tip = getTagAttrComment(word, info); break; default: break; //不明とか属性値は何もしない } return(tip); }
/// <summary> /// KAGタグヘルプを表示する /// </summary> /// <param name="editor">エディタ</param> private void showKagTagHelp(TextEditorEx editor) { //カーソル位置のKAGタグ情報を取得する Debug.WriteLine("showKagTagHelp START"); int colNum = editor.GetKagTagEndFormCaret(); KagTagKindInfo info = KagUtility.GetTagKind(editor.Document, editor.ActiveTextArea.Caret.Line, colNum); if (info == null) { util.Msgbox.Error("タグ・マクロのある位置にカーソルが無いため検索できません"); return; } if (info.TagName == "") { return; //タグがない } //KAGタグ情報からマクロ情報を取得する KagMacro macro = KagUtility.GetKagMacro(info.TagName); if (macro == null) { //タグ情報が取得できなかった util.Msgbox.Error("タグ・マクロの情報が取得できませんでした"); return; } //URLを生成する string url = ""; if (macro.DefType == KagMacro.DefineType.Kag) //KAGのタグの時 { url = String.Format("{0}#{1}", new Uri(ConstEnvOption.Kag3TagRefPath), HttpUtility.UrlEncode(info.TagName)); } else { return; //そのほかのタグは対応するヘルプがない } switch (GlobalStatus.EnvOption.HelpHelpWindow) { case EnvOption.HelpWindowState.DockingWindow: //ドッキングウィンドウで表示 GlobalStatus.FormManager.HelpReferenceForm.Show(GlobalStatus.FormManager.MainForm.MainDockPanel); GlobalStatus.FormManager.HelpReferenceForm.Navigate(url); break; case EnvOption.HelpWindowState.DialogWindow: //ダイアログウィンドウで表示 GlobalStatus.FormManager.HelpRefDialogShow(); GlobalStatus.FormManager.HelpRefDialog.Navigate(url); break; } }
/// <summary> /// 指定した属性の説明を取得する /// </summary> /// <param name="info"></param> /// <param name="attrName"></param> /// <returns></returns> private static string getTagAttrComment(string attrName, KagTagKindInfo info) { KagMacro[] macroList = GlobalStatus.ParserSrv.GetKagMacroList(); if (macroList.Length == 0) { return(""); //一つもないとき } KagMacroAttr attr = KagUtility.GetKagMacroAttr(attrName, info, macroList); if (attr == null) { return(""); //属性が取得できなかったとき } return(attr.Comment); }
/// <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; } }
/// <summary> /// KAGタグの情報をエディタドキュメント情報から取得し返す /// </summary> /// <param name="document">エディタのドキュメント情報</param> /// <param name="lineNumber">行番号</param> /// <param name="colNumber">カーソル位置を表す桁番号</param> /// <returns>KAGタグ情報(見つからなかったときはnullを返す)</returns> public static KagTagKindInfo GetTagKind(string lineText, int colNumber) { if (string.IsNullOrEmpty(lineText)) { return(null); } if (colNumber < lineText.Length) { lineText = lineText.Substring(0, colNumber); } if (KagUtility.ExistLineHead(lineText, ';')) { return(null); //コメント行のとき } if (KagUtility.ExistLineHead(lineText, '*')) { return(null); //ラベル行のとき } KagTagKindInfo info = KagUtility.GetTagKind(lineText); return(info); }
/// <summary> /// KAGタグの情報をライン行文字列から取得し返す /// </summary> /// <param name="line">情報を取得するタグ情報</param> /// <returns>タグ情報</returns> public static KagTagKindInfo GetTagKind(string line) { KagTagKindInfo info = new KagTagKindInfo(); bool startFlag = true; //先頭の時true bool stringModeFlag = false; //文字列中("")のときtrue for (int i = 0; i < line.Length; i++) { if (line[i] == '[') { startFlag = false; if (stringModeFlag == false && info.Kind == KagCompletionData.Kind.Unknown) { info.Kind = KagCompletionData.Kind.KagTagName; info.TagName = ""; info.AttrName = ""; info.AttrValue = ""; info.AttrTable.Clear(); } } else if (line[i] == '@') { if (startFlag) { startFlag = false; info.Kind = KagCompletionData.Kind.KagTagName; info.TagName = ""; info.AttrName = ""; info.AttrValue = ""; info.AttrTable.Clear(); } } else if (line[i] == ']') { startFlag = false; if (stringModeFlag == false) { info.Kind = KagCompletionData.Kind.Unknown; info.TagName = ""; info.AttrValue = ""; info.AttrValue = ""; } } else if (line[i] == ' ') { startFlag = false; switch (info.Kind) { case KagCompletionData.Kind.KagTagName: case KagCompletionData.Kind.AttrName: case KagCompletionData.Kind.AttrValue: if (stringModeFlag == false) { info.Kind = KagCompletionData.Kind.AttrName; info.AddAttrTable(info.AttrName, info.AttrValue); info.AttrName = ""; info.AttrValue = ""; } break; default: break; } } else if (line[i] == '=') { startFlag = false; switch (info.Kind) { case KagCompletionData.Kind.AttrName: info.Kind = KagCompletionData.Kind.AttrValue; info.AddAttrTable(info.AttrName, info.AttrValue); info.AttrValue = ""; break; default: break; } } else if (line[i] == '"') { startFlag = false; if (i != 0 && line[i - 1] == '\\') //"がエスケープされているとき { continue; } stringModeFlag = !stringModeFlag; //フラグを反転させる } else if (line[i] == '\t') { //何もしない } else { startFlag = false; switch (info.Kind) { case KagCompletionData.Kind.KagTagName: info.TagName += line[i]; break; case KagCompletionData.Kind.AttrName: info.AttrName += line[i]; break; case KagCompletionData.Kind.AttrValue: info.AttrValue += line[i]; break; } } } if (info.Kind == KagCompletionData.Kind.AttrName || info.Kind == KagCompletionData.Kind.AttrValue) { info.AddAttrTable(info.AttrName, info.AttrValue); } info.StrMode = stringModeFlag; return(info); }
/// <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; } }