/// <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); }