/// <summary> /// 属性名リストを取得する /// </summary> /// <param name="info">現在位置の入力情報</param> /// <param name="macroList">マクロ情報リスト</param> /// <returns>マクロ名リスト</returns> ICompletionData[] getAttrNameList(KagTagKindInfo info, KagMacro[] macroList) { KagMacro macro = KagUtility.GetKagMacro(info.TagName, macroList); if (macro == null) { return(null); //マクロが見つからない } //属性を取得 resetReverseCount(); Dictionary <string, ICompletionData> table = new Dictionary <string, ICompletionData>(); table = getAttrNameListFromMacro(macro, macroList, table); //すでに書いているものは削除する foreach (string deleteAttrName in info.AttrTable.Keys) { table.Remove(deleteAttrName); } //出力用にリストを変換 ICompletionData[] list = new ICompletionData[table.Count]; int i = 0; foreach (ICompletionData data in table.Values) { list[i++] = data; } return(list); }
/// <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(ScintillaNet.ScintillaControl sci, int position) { if (sci == null) { return(""); //ドキュメントがないとき } string tip = ""; string lineText = KagUtility.GetKagLineText(sci, position); string word = sci.GetWordFromPosition(position); KagTagKindInfo info = KagUtility.GetTagKind(lineText); if (info == null) { return(""); //取得できなかった } switch (info.Kind) { case KagTagKindInfo.KagKind.KagTagName: tip = getTagComment(word); break; case KagTagKindInfo.KagKind.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="macroName"></param> /// <returns></returns> private static string getTagComment(string macroName) { KagMacro macro = KagUtility.GetKagMacro(macroName); if (macro == null) { return(""); } return(macro.Comment); }
/// <summary> /// 指定した属性の説明を取得する /// </summary> /// <param name="info"></param> /// <param name="attrName"></param> /// <returns></returns> private static string getTagAttrComment(string attrName, KagTagKindInfo info) { KagMacro[] macroList = PluginMain.ParserSrv.GetKagMacroList(); if (macroList.Length == 0) { return(""); //一つもないとき } KagMacroAttr attr = KagUtility.GetKagMacroAttr(attrName, info, macroList); if (attr == null) { return(""); //属性が取得できなかったとき } return(attr.Comment); }
/// <summary> /// 属性値リストを取得する /// </summary> /// <param name="macro">取得するマクロオブジェクト</param> /// <param name="macroList">マクロ情報リスト</param> /// <returns>属性値リスト</returns> private ICompletionData[] getAttrValueList(KagTagKindInfo info, KagMacro[] macroList) { KagMacro macro = KagUtility.GetKagMacro(info.TagName, macroList); if (macro == null) { return(null); //マクロが見つからない } resetReverseCount(); KagMacroAttr attr = getMacroAttr(info.AttrName, macro, macroList); if (attr == null) { return(null); //属性が見つからない } return(KagCompletionAttrValue.GetCompletionDataList(attr, info)); }
/// <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> /// マクロ属性オブジェクトを取得する /// (再帰する) /// </summary> /// <param name="attrName">取得したい属性名</param> /// <param name="macro">属性の所属するマクロオブジェクト</param> /// <param name="macroList">マクロ情報リスト</param> /// <returns>属性オブジェクト</returns> private KagMacroAttr getMacroAttr(string attrName, KagMacro macro, KagMacro[] macroList) { if (overcheckReverseCount()) { //再帰回数がオーバーしているときは何もせずに終了する return(null); } //属性リストから検索する foreach (KagMacroAttr attr in macro.AttrTable.Values) { if (attrName == attr.Name) { return(attr); //属性を見つけた } } //省略属性リストから検索する KagMacro asterMacro = null; foreach (string tagName in macro.AsteriskTagList) { asterMacro = KagUtility.GetKagMacro(tagName, macroList); if (asterMacro == null) { continue; //このマクロは見つからない } KagMacroAttr attr = getMacroAttr(attrName, asterMacro, macroList); if (attr != null) { return(attr); //属性を見つけた } } return(null); //見つからなかった }
/// <summary> /// マクロオブジェクトから属性名リストを取得する /// *再帰する /// </summary> /// <param name="macro">取得するマクロオブジェクト</param> /// <param name="macroList">マクロ情報リスト</param> /// <param name="table">取得した属性名を格納するテーブル</param> /// <returns>取得した属性名テーブル(tableをそのまま返す)</returns> private Dictionary <string, ICompletionData> getAttrNameListFromMacro(KagMacro macro , KagMacro[] macroList, Dictionary <string, ICompletionData> table) { if (overcheckReverseCount()) { //再帰回数がオーバーしているときは何もせずに終了する return(table); } //通常のマクロ属性を追加 foreach (KagMacroAttr attr in macro.AttrTable.Values) { if (table.ContainsKey(attr.Name) == false) { //存在しないときだけ追加する table.Add(attr.Name, new KagCompletionData(attr.Name, attr.Comment, KagCompletionData.Kind.AttrName)); } } //全省略マクロ属性を追加 KagMacro asterMacro = null; foreach (string macroName in macro.AsteriskTagList) { asterMacro = KagUtility.GetKagMacro(macroName, macroList); if (asterMacro == null) { continue; //このマクロは飛ばす } //自分自身を呼び出し table = getAttrNameListFromMacro(asterMacro, macroList, table); } return(table); }
/// <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; } }
/// <summary> /// KAG入力補完リストに表示するアイテムリストを返す /// </summary> /// <param name="fileName">ファイル名</param> /// <param name="textArea">アクティブなテキストエディタ</param> /// <param name="charTyped">入力された文字列</param> /// <returns>入力補完アイテムリスト</returns> public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped) { KagMacro[] macroList = GlobalStatus.ParserSrv.GetKagMacroList(); if (macroList.Length == 0) { return(null); //一つもないときはリストを表示しない } int lineNum = textArea.Caret.Line; int colNum = textArea.Caret.Column; LineSegment lineSeg = textArea.Document.GetLineSegment(lineNum); string lineText = textArea.Document.GetText(lineSeg.Offset, colNum); if (KagUtility.ExistLineHead(lineText, ';')) { return(null); //コメント行のとき } if (KagUtility.ExistLineHead(lineText, '*')) { return(null); //ラベル行のとき } m_preSelection = null; ICompletionData[] list = null; KagTagKindInfo info = KagUtility.GetTagKind(lineText); if (charTyped == '[') //タグ名? { if (KagUtility.ExistLineHead(lineText, '@')) { return(null); //@タグがある } if (info.StrMode) { return(null); //文字列表示中 } //タグ入力 list = getMacroNameList(info, macroList); } else if (charTyped == '@') //タグ名? { if (KagUtility.IsLineHead(lineText, colNum) == false) { return(null); //行頭ではない } if (info.StrMode) { return(null); } //タグ入力 list = getMacroNameList(info, macroList); } else if (charTyped == ' ') //属性名? { if ((info.Kind == KagCompletionData.Kind.Unknown) || (info.StrMode == true)) { return(null); //属性名ではないので何もしない } //属性名 list = getAttrNameList(info, macroList); } else if (charTyped == '=') //属性値? { if (info.Kind != KagCompletionData.Kind.AttrName) { return(null); //属性値ではないので何もしない } //属性値 list = getAttrValueList(info, macroList); } else if (charTyped == '\0') //その他(Ctrl+Space) { switch (info.Kind) { case KagCompletionData.Kind.KagTagName: case KagCompletionData.Kind.Unknown: if (info.StrMode) { return(null); } //タグ入力 list = getMacroNameList(info, macroList); break; case KagCompletionData.Kind.AttrName: if (info.StrMode) { return(null); } //属性入力 list = getAttrNameList(info, macroList); break; case KagCompletionData.Kind.AttrValue: //属性値入力 list = getAttrValueList(info, macroList); break; default: return(null); } //Debug.WriteLine("info=" + info.ToString()); m_preSelection = getCompReplaceText(textArea, info); } else { return(null); //何も表示しない } if (list == null || list.Length == 0) { return(null); //一つもないとき } return(list); }
/// <summary> /// KAG入力補完リストに表示するアイテムリストを返す /// </summary> /// <param name="fileName">ファイル名</param> /// <param name="textArea">アクティブなテキストエディタ</param> /// <param name="charTyped">入力された文字列</param> /// <returns>入力補完アイテムリスト</returns> public List <ICompletionListItem> GenerateCompletionData(ScintillaControl sci, char charTyped) { KagMacro[] macroList = PluginMain.ParserSrv.GetKagMacroList(); if (macroList.Length == 0) { return(null); //一つもないときはリストを表示しない } string lineText = KagUtility.GetKagLineText(sci, sci.CurrentPos); if (KagUtility.ExistLineHead(lineText, ';')) { return(null); //コメント行のとき } if (KagUtility.ExistLineHead(lineText, '*')) { return(null); //ラベル行のとき } m_preSelection = null; List <ICompletionListItem> list = null; KagTagKindInfo info = KagUtility.GetTagKind(lineText); if (charTyped == '[') //タグ名? { if (KagUtility.ExistLineHead(lineText, '@')) { return(null); //@タグがある } if (info.StrMode) { return(null); //文字列表示中 } //タグ入力 list = getMacroNameList(info, macroList, "", ""); } else if (charTyped == '@') //タグ名? { if (!KagUtility.ExistLineHead(lineText, '@')) { return(null); //@タグがない } if (lineText.Trim(new char[] { ' ', '\0', '\t' }) != "@") { return(null); //@タグではない } if (info.StrMode) { return(null); } //タグ入力 list = getMacroNameList(info, macroList, "", ""); } else if (charTyped == ' ') //属性名? { if ((info.Kind == KagTagKindInfo.KagKind.Unknown) || (info.StrMode == true)) { return(null); //属性名ではないので何もしない } //属性名 list = getAttrNameList(info, macroList); } else if (charTyped == '=') //属性値? { if (info.Kind != KagTagKindInfo.KagKind.AttrValue) { return(null); //属性値ではないので何もしない } //属性値 list = getAttrValueList(info, macroList); } else if (charTyped == '\0') //その他(Ctrl+Space) { switch (info.Kind) { case KagTagKindInfo.KagKind.KagTagName: if (info.StrMode) { return(null); } //タグ入力 list = getMacroNameList(info, macroList, "", ""); break; case KagTagKindInfo.KagKind.Unknown: if (info.StrMode) { return(null); } //タグ入力 list = getMacroNameList(info, macroList, "[", "]"); break; case KagTagKindInfo.KagKind.AttrName: if (info.StrMode) { return(null); } //属性入力 list = getAttrNameList(info, macroList); break; case KagTagKindInfo.KagKind.AttrValue: //属性値入力 list = getAttrValueList(info, macroList); break; default: return(null); } //Debug.WriteLine("info=" + info.ToString()); m_preSelection = getCompReplaceText(sci, info); } else { return(null); //何も表示しない } if (list == null || list.Count == 0) { return(null); //一つもないとき } return(list); }