Beispiel #1
0
        /// <summary>
        /// ジャンプリスト
        /// </summary>
        private void tolJumpList_Click(object sender, EventArgs e)
        {
            var Dlg = new Dialog.Common.dlgSelectInList("ジャンプリスト");

            //全行の行頭を走査
            for (var i = 0; i < this.azkEditor.Document.LineCount; i++)
            {
                var buf = this.azkEditor.Document.GetLineContent(i);
                if (buf.Length >= Settings.Default.Text_JumpChar.Length && buf.Substring(0, Settings.Default.Text_JumpChar.Length) == Settings.Default.Text_JumpChar)
                {
                    Dlg.AddItem(i + 1, buf);
                }
            }

            if (Dlg.ItemCount == 0)
            {
                //ジャンプリストがない場合は中断
                MessageBox.Show(Resources.MsgE_NothingJumpList, Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else if (Dlg.ShowDialog() == DialogResult.OK)
            {
                var line = Dlg.GetResultID();
                this.azkEditor.SetSelection(
                    this.azkEditor.Document.GetLineHeadIndex(line - 1),
                    this.azkEditor.Document.GetLineEndIndexFromCharIndex(this.azkEditor.Document.GetLineHeadIndex(line - 1))
                    );
                this.azkEditor.ScrollToCaret();
            }
        }
Beispiel #2
0
        /// <summary>
        /// 外部からデータを取り込みます。
        /// </summary>
        public virtual DialogResult Import()
        {
            var    tempDB = new DataGridView();
            var    index  = 0;
            string fullPath;

            //読み込むファイルをユーザーに選択してもらう
            this.dlgImporter.Filter = $"|{Path.GetFileName(this.FileName)}";
            if (this.dlgImporter.ShowDialog() != DialogResult.OK)
            {
                return(DialogResult.Cancel);
            }
            fullPath = this.dlgImporter.FileName;

            //複数のサブDBがある場合はユーザーに選択してもらう
            if (this.DBs.Length > 1)
            {
                var Dlg = new Dialog.Common.dlgSelectInList("サブデータベースの選択");
                for (var i = 0; i < this.DBs.Length; i++)
                {
                    Dlg.AddItem(i, this.DBs[i].Tag?.ToString());
                }
                if (Dlg.ShowDialog() != DialogResult.OK)
                {
                    return(DialogResult.Cancel);
                }
                index = Dlg.GetResultID();
            }

            //インポート元のファイルを開く
            try {
                using (var R = new StreamReader(Common.OpenFileReadOnly(fullPath), Common.SJIS)) {
                    //読み込むサブDBのところまで進める
                    for (var i = 0; i < index; i++)
                    {
                        //一時的に生成したDataGridViewに列をセットする
                        tempDB.Columns.Clear();
                        tempDB.Rows.Clear();
                        foreach (DataGridViewColumn col in this.DBs[i].Columns)
                        {
                            tempDB.Columns.Add(col.Clone() as DataGridViewColumn);
                        }
                        Database.ReadDatabase(tempDB, R);
                    }

                    //追加読み込みを行う(ただし、行を追加できないタイプのものは置き換える)
                    Database.ReadDatabase(this.DBs[index], R, this.DBs[index].AllowUserToAddRows);
                }
                return(DialogResult.OK);
            } catch {
                return(DialogResult.No);
            }
        }
Beispiel #3
0
        /// <summary>
        /// コード逆探索
        /// </summary>
        private void tolInsertReserchCode_Click(object sender, EventArgs e)
        {
            //カーソル部分の単語を抽出する
            var doc = this.azkEditor.Document;

            this.azkEditor.Document.GetSelection(out var x, out var y);
            string word, line;

            try {
                line = Common.CutHeadTabs(this.azkEditor.Document.GetLineContent(
                                              this.azkEditor.Document.GetLineIndexFromCharIndex(this.azkEditor.Document.AnchorIndex)))
                       .Trim();

                if (x == y && x > 0)
                {
                    //カーソルにある単語を選択状態にする
                    word = this.azkEditor.Document.GetTextInRange(
                        this.azkEditor.Document.WordProc.PrevWordStart(this.azkEditor.Document, x - 1),
                        this.azkEditor.Document.WordProc.NextWordStart(this.azkEditor.Document, x))
                           .Replace("\r\n", "");
                    this.azkEditor.Document.SetSelection(
                        this.azkEditor.Document.WordProc.PrevWordStart(this.azkEditor.Document, x - 1),
                        this.azkEditor.Document.WordProc.NextWordStart(this.azkEditor.Document, x)
                        );
                }
                else
                {
                    word = this.azkEditor.Document.GetTextInRange(x, y);
                }

                if (string.IsNullOrEmpty(word))
                {
                    //見つからなかった
                    throw new Exception();
                }
                else if (word.Length > 2 && word.Substring(0, 2) == "0x")
                {
                    //16進数と見られる文字列は接頭辞を削除する
                    word = word.Substring(2);
                }

                if (int.TryParse(word, System.Globalization.NumberStyles.AllowHexSpecifier, null, out var id) ||
                    int.TryParse(word, out id))
                {
                    //数値の場合はデータベースのIDとして検索する
                    var list = this.DBCtrl.FindDBRow(id);
                    if (list.Count > 0)
                    {
                        var index = 0;
                        if (list.Count > 1)
                        {
                            //複数見つかった場合は重複解決ダイアログを開く
                            var Dlg = new Dialog.Common.dlgSelectInList("データベースの選択");
                            for (var i = 0; i < list.Count; i++)
                            {
                                Dlg.AddItem(i + 1, list[i].Item2.Tag?.ToString());
                            }
                            if (Dlg.ShowDialog() != DialogResult.OK)
                            {
                                //キャンセル中断
                                return;
                            }
                            index = Dlg.GetResultID();
                        }
                        MessageBox.Show("次のデータベース項目に該当しました:\r\n" + list[index].Item2.Tag?.ToString() + "\r\n" + list[index].Item1, Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        //見つからなかった
                        throw new Exception();
                    }
                }
                else if (line.IndexOf(Resources.SQ_EVMessage.Substring(0, Resources.SQ_EVMessage.IndexOf("("))) != -1)
                {
                    //メッセージ表示のコマンドがある場合
                    this.azkEditor.Document.SetSelection(
                        this.azkEditor.Document.GetLineHeadIndexFromCharIndex(x),
                        this.azkEditor.Document.GetLineEndIndexFromCharIndex(
                            this.azkEditor.Document.GetLineHeadIndex(this.azkEditor.Document.GetLineIndexFromCharIndex(x))
                            ) - 2
                        );
                    this.FoundCommandNode?.Invoke(this, new FoundCommandNodeEventArgs(CtrlComponent.Text.ctlCommandTree.TagToolMessage, line));
                }
                else if (line.IndexOf(Resources.SQ_ChangeMap.Substring(0, Resources.SQ_ChangeMap.IndexOf("("))) != -1)
                {
                    //場所移動のコマンドがある場合
                    this.azkEditor.Document.SetSelection(
                        this.azkEditor.Document.GetLineHeadIndexFromCharIndex(x),
                        this.azkEditor.Document.GetLineEndIndexFromCharIndex(
                            this.azkEditor.Document.GetLineHeadIndex(this.azkEditor.Document.GetLineIndexFromCharIndex(x))
                            ) - 2
                        );
                    this.FoundCommandNode?.Invoke(this, new FoundCommandNodeEventArgs(CtrlComponent.Text.ctlCommandTree.TagToolChangeMap, line));
                }
                else
                {
                    //文字列の場合はコードとみなしてコマンドツリーで検索にかける
                    var foundNodes  = ctlCommandTree.FindNodes(word);
                    var targetIndex = 0;

                    if (foundNodes == null || foundNodes.Count == 0)
                    {
                        //見つからなかった
                        throw new Exception();
                    }

                    if (foundNodes.Count > 1)
                    {
                        // 複数見つかったときはユーザーに選ばせる
                        var Dlg   = new dlgSelectInList("複数の候補 - コード逆探索");
                        var count = 1;
                        foreach (var node in foundNodes)
                        {
                            Dlg.AddItem(count, node.FullPath);
                            count++;
                        }
                        if (Dlg.ShowDialog() != DialogResult.OK)
                        {
                            return;
                        }
                        targetIndex = Dlg.GetResultIndex();
                    }

                    //引数リストもすべて選択する
                    var      foundNode = foundNodes[targetIndex];
                    var      start     = line.IndexOf(word) + word.Length;
                    var      depth     = 0;
                    string[] args      = null;

                    if (line.IndexOf("(", start) == start)
                    {
                        //すぐ後ろに引数リストがある場合は選択範囲を伸ばす
                        //ただし、閉じ括弧がないときは伸ばさない
                        for (var index = start + 1; index < line.Length; index++)
                        {
                            var temp = line.Substring(index, 1);
                            if (temp == "(")
                            {
                                depth++;
                                continue;
                            }
                            if (temp == ")")
                            {
                                depth--;
                            }

                            if (depth < 0)
                            {
                                //関数呼び出しの括弧が閉じられたらここで終わる
                                word += line.Substring(start, index - start + 1);

                                //引数リストを取得
                                args = SQ.GetArgumentListByCall(word);

                                //選択範囲を伸ばす
                                this.azkEditor.Document.SetSelection(
                                    this.azkEditor.Document.AnchorIndex,
                                    this.azkEditor.Document.AnchorIndex + word.Length
                                    );
                                break;
                            }
                        }
                    }
                    this.FoundCommandNode?.Invoke(this, new FoundCommandNodeEventArgs(foundNode, args));
                }
            } catch {
                //見つからなかったらビープ音を鳴らす
                System.Media.SystemSounds.Beep.Play();
            }
        }
Beispiel #4
0
        /// <summary>
        /// ツールによって挿入コードを生成します。
        /// </summary>
        private string getCodeTool(TreeNode node)
        {
            var nodeTag = node.Tag?.ToString();

            switch (nodeTag)
            {
            case TagToolMessage:
                var DlgMsg = new Dialog.Text.Script.dlgEVcmdMessage(this.dbCtl.DBList);
                if (DlgMsg.ShowDialog() != DialogResult.OK)
                {
                    return("");
                }
                return(DlgMsg.Result);

            case TagToolFileName:
                var DlgFN = new Dialog.Common.dlgFileSelect(null, "", true, true, false);
                if (DlgFN.ShowDialog() != DialogResult.OK)
                {
                    return("");
                }
                //両端のダブルクォートとパス区切り記号のエスケープシーケンス化
                return("\"" + DlgFN.FileName.Replace("\\", "\\\\") + "\"");

            case TagToolEVID:
                if (this.ParentForm is Dialog.Map.dlgEVSettings)
                {
                    //イベント編集画面のときに限る
                    if (this.mgrMap.MapData == null)
                    {
                        //編集中のマップが存在しない
                        return("");
                    }

                    var DlgEVID = new Dialog.Common.dlgSelectInList("イベントIDの挿入");
                    for (var i = 0; i < this.mgrMap.MapData.EVCount; i++)
                    {
                        DlgEVID.AddItem(this.mgrMap.MapData[i].VisibleID, this.mgrMap.MapData[i].Name);
                    }

                    if (DlgEVID.ShowDialog() != DialogResult.OK)
                    {
                        //ダイアログ中断
                        return("");
                    }

                    if (!Settings.Default.Script_FixedIDHexMode)
                    {
                        //10進数のID表記
                        return(this.mgrMap.MapData[DlgEVID.GetResultIndex()].FixedID.ToString() + "/*" + DlgEVID.GetResultTitle() + "*/");
                    }
                    else
                    {
                        //16進数のID表記
                        return("0x" + this.mgrMap.MapData[DlgEVID.GetResultIndex()].FixedID.ToString("X") + "/*" + DlgEVID.GetResultTitle() + "*/");
                    }
                }
                else
                {
                    MessageBox.Show("イベントIDの挿入はマップエディター上のイベント編集画面でのみ有効です。", Resources.AppName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return("");
                }

            case TagToolDBID:
            case TagToolDBColumn:
                var DlgDB2 = new Dialog.Text.Script.dlgInsertDB(this.dbCtl.DBList, (nodeTag == TagToolDBColumn) ? true : false, false);
                if (DlgDB2.ShowDialog() != DialogResult.OK)
                {
                    return("");
                }
                return(DlgDB2.Result);

            case TagToolChangeMap:
                var DlgMap = new Dialog.Text.Script.dlgEVcmdChangeMap(this.dbCtl.DBList);
                if (DlgMap.ShowDialog() != DialogResult.OK)
                {
                    return("");
                }
                return(DlgMap.Result);

            case TagToolColor:
                var DlgCLR = new ColorDialog {
                    AllowFullOpen = true,
                    FullOpen      = true
                };
                if (DlgCLR.ShowDialog() != DialogResult.OK)
                {
                    return("");
                }

                //RGBの順で3つの引数を作り、カラーコードを取得する関数をセットにする
                return(Resources.SQ_GetColor.Replace("$", $"{DlgCLR.Color.R}, {DlgCLR.Color.G}, {DlgCLR.Color.B}"));

            case TagToolPathNormalEV:
            case TagToolPathExtraEV:
            case TagToolPathExtraPlayer:
                var DlgPath = new Dialog.Text.Script.dlgEVcmdMoveTask(
                    nodeTag != TagToolPathNormalEV,
                    nodeTag == TagToolPathExtraPlayer
                    );
                if (DlgPath.ShowDialog() != DialogResult.OK)
                {
                    return("");
                }
                return(DlgPath.Result);

            case TagSQTagSummary:
                return(GenerateGlueCode.GenerateSQDocument.SQ_TAG + GenerateGlueCode.GenerateSQDocument.DOC_SUMMARY + "\r\n");

            case TagSQTagNode:
                return(GenerateGlueCode.GenerateSQDocument.SQ_TAG + GenerateGlueCode.GenerateSQDocument.DOC_PATH + "\r\n");

            case TagSQTagParameter:
                return(GenerateGlueCode.GenerateSQDocument.SQ_TAG + GenerateGlueCode.GenerateSQDocument.DOC_PARAM + "\r\n");

            case TagSQTagReturn:
                return(GenerateGlueCode.GenerateSQDocument.SQ_TAG + GenerateGlueCode.GenerateSQDocument.DOC_RETURN + "\r\n");

            case TagSQTagComment:
                return(GenerateGlueCode.GenerateSQDocument.SQ_TAG + GenerateGlueCode.GenerateSQDocument.DOC_COMMENT + "\r\n");
            }
            return("");
        }