Example #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();
            }
        }
Example #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);
            }
        }
Example #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();
            }
        }