Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }