/// <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);
        }
Exemple #2
0
        /// <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;
            }
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        /// <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;
            }
        }
Exemple #5
0
        /// <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);
        }
Exemple #6
0
        /// <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));
        }
Exemple #8
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;
            }
        }
        /// <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);
        }
Exemple #11
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;
            }
        }
        /// <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);
        }
Exemple #13
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);
        }