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