OSDN Git Service

#30333 [DTXC] MIDIインポート機能のbranchのビルド成功記念に、少しだけ修正。
[dtxmania/dtxmania.git] / DTXCreatorプロジェクト / コード / 00.全体 / Cメインフォーム.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Globalization;\r
4 using System.Threading;\r
5 using System.Windows.Forms;\r
6 using System.Drawing;\r
7 using System.ComponentModel;\r
8 using System.IO;\r
9 using System.Text;\r
10 using System.Diagnostics;\r
11 using System.Xml.Serialization;\r
12 using DTXCreator.チップパレット関連;\r
13 using DTXCreator.譜面;\r
14 using DTXCreator.WAV_BMP_AVI;\r
15 using DTXCreator.UndoRedo;\r
16 using DTXCreator.オプション関連;\r
17 using DTXCreator.MIDIインポート;\r
18 using DTXCreator.汎用;\r
19 using DTXCreator.Properties;\r
20 using FDK;\r
21 \r
22 namespace DTXCreator\r
23 {\r
24         public partial class Cメインフォーム : Form\r
25         {\r
26                 // コンストラクタ\r
27 \r
28                 #region [ コンストラクタ ]\r
29                 //-----------------\r
30                 public Cメインフォーム()\r
31                 {\r
32                         this.InitializeComponent();\r
33                 }\r
34                 //-----------------\r
35                 #endregion\r
36 \r
37 \r
38                 // プロパティ\r
39 \r
40                 #region [ プロパティ ]\r
41                 //-----------------\r
42 \r
43                 public AppSetting appアプリ設定;\r
44                 public Cチップパレット dlgチップパレット;\r
45                 private Cオプション管理 mgrオプション管理者 = null;\r
46                 private C選択モード管理 mgr選択モード管理者 = null;\r
47                 private C編集モード管理 mgr編集モード管理者 = null;\r
48                 internal C譜面管理 mgr譜面管理者 = null;\r
49                 internal CWAVリスト管理 mgrWAVリスト管理者 = null;\r
50                 internal CBMPリスト管理 mgrBMPリスト管理者 = null;\r
51                 internal CAVIリスト管理 mgrAVIリスト管理者 = null;\r
52                 internal CUndoRedo管理 mgrUndoRedo管理者 = null;\r
53                 internal Cクリップボード cbクリップボード = null;\r
54                 private CMIDIインポート管理 mgrMIDIインポート管理者 = null;\r
55 \r
56                 internal MakeTempDTX makeTempDTX = null;\r
57 \r
58                 public bool b選択モードである\r
59                 {\r
60                         get\r
61                         {\r
62                                 if( this.toolStripButton選択モード.CheckState != CheckState.Checked )\r
63                                 {\r
64                                         return false;\r
65                                 }\r
66                                 return true;\r
67                         }\r
68                 }\r
69                 public bool b編集モードである\r
70                 {\r
71                         get\r
72                         {\r
73                                 if( this.toolStripButton編集モード.CheckState != CheckState.Checked )\r
74                                 {\r
75                                         return false;\r
76                                 }\r
77                                 return true;\r
78                         }\r
79                 }\r
80                 public decimal dc現在のBPM\r
81                 {\r
82                         get\r
83                         {\r
84                                 return this.numericUpDownBPM.Value;\r
85                         }\r
86                 }\r
87                 internal int n現在選択中のWAV_BMP_AVIリストの行番号0to1294;\r
88 \r
89                 /// <summary>\r
90                 /// DTXC.exe のあるフォルダの絶対パス。\r
91                 /// </summary>\r
92                 public string strDTXCのあるフォルダ名;\r
93 \r
94                 /// <summary>\r
95                 /// 各種ファイル(WAVなど)の相対パスの基点となるフォルダの絶対パス。\r
96                 /// </summary>\r
97                 public string str作業フォルダ名;\r
98 \r
99                 /// <summary>\r
100                 /// 現在作成中のDTXファイル名。パスは含まない。(例:"test.dtx")\r
101                 /// </summary>\r
102                 public string strDTXファイル名;\r
103 \r
104                 /// <summary>\r
105                 /// <para>未保存の場合にtrueとなり、ウィンドウタイトルに[*]が加えられる。</para>\r
106                 /// </summary>\r
107                 internal bool b未保存\r
108                 {\r
109                         get\r
110                         {\r
111                                 return this._b未保存;\r
112                         }\r
113                         set\r
114                         {\r
115                                 // 現状と値が違うときだけ更新する。\r
116 \r
117                                 if( this._b未保存 != value )\r
118                                 {\r
119                                         this._b未保存 = value;               // #24133 2011.1.14 yyagi: 「代入後にif文分岐」するよう、代入を頭に移動。\r
120 \r
121                                         // タイトル文字列を取得。\r
122 \r
123                                         string strタイトル = Resources.strデフォルトウィンドウタイトル;\r
124 \r
125                                         if( this.strDTXファイル名.Length > 0 )\r
126                                                 strタイトル = this.strDTXファイル名;\r
127 \r
128                                         \r
129                                         // タイトル文字列を修正。\r
130 \r
131                                         if( this._b未保存 )\r
132                                         {\r
133                                                 // 変更ありかつ未保存なら「*」を付ける\r
134 \r
135                                                 this.Text = "DTXC* [" + strタイトル + "]";\r
136                                                 this.toolStripMenuItem上書き保存.Enabled = true;\r
137                                                 this.toolStripButton上書き保存.Enabled = true;\r
138                                         }\r
139                                         else\r
140                                         {\r
141                                                 // 保存後変更がないなら「*」なない\r
142 \r
143                                                 this.Text = "DTXC [" + strタイトル + "]";\r
144                                                 this.toolStripMenuItem上書き保存.Enabled = false;\r
145                                                 this.toolStripButton上書き保存.Enabled = false;\r
146                                         }\r
147                                 }\r
148                         }\r
149                 }\r
150 \r
151                 //-----------------\r
152                 #endregion\r
153 \r
154 \r
155                 // シナリオ\r
156 \r
157                 #region [ アプリの起動・初期化、終了 ]\r
158                 //-----------------\r
159                 private void tアプリ起動時に一度だけ行う初期化処理()\r
160                 {\r
161                         // 初期化\r
162 \r
163                         #region [ アプリ設定オブジェクトを生成する。]\r
164                         //-----------------\r
165                         this.appアプリ設定 = new AppSetting();\r
166                         //-----------------\r
167                         #endregion\r
168 \r
169                         #region [ DTXCreator.exe の存在するフォルダを取得する。 ]\r
170                         //-----------------\r
171                         this.strDTXCのあるフォルダ名 = Directory.GetCurrentDirectory() + @"\";\r
172                         //-----------------\r
173                         #endregion\r
174                         #region [ 作業フォルダを取得する。]\r
175                         //-----------------\r
176                         this.str作業フォルダ名 = this.strDTXCのあるフォルダ名;\r
177                         //-----------------\r
178                         #endregion\r
179 \r
180                         #region [ デザイナで設定できないイベントを実装する。]\r
181                         //-----------------\r
182                         this.splitContainerタブと譜面を分割.MouseWheel += new MouseEventHandler( this.splitContainerタブと譜面を分割_MouseWheel );\r
183                         //-----------------\r
184                         #endregion\r
185 \r
186                         #region [ 全体を通して必要な管理者オブジェクトを生成する。]\r
187                         //-----------------\r
188                         this.mgrオプション管理者 = new Cオプション管理( this );\r
189                         this.mgrMIDIインポート管理者 = new CMIDIインポート管理(this);\r
190                         //-----------------\r
191                         #endregion\r
192 \r
193                         #region [ クリップボードオブジェクトを生成する。 ]\r
194                         //-----------------\r
195                         this.cbクリップボード = new Cクリップボード( this );\r
196                         //-----------------\r
197                         #endregion\r
198 \r
199                         #region [ Viewer再生用一時DTX生成オブジェクトを生成する。 ]\r
200                         makeTempDTX = new MakeTempDTX();\r
201                         #endregion\r
202 \r
203                         #region [ 譜面を初期化する。]\r
204                         //-----------------\r
205                         this.t譜面を初期化する();\r
206                         //-----------------\r
207                         #endregion\r
208 \r
209                         #region [ アプリ設定ファイル (DTXCreatorSetting.config) を読み込む。]\r
210                         //-----------------\r
211                         this.tアプリ設定の読み込み(); // 譜面の生成後に行うこと。(GUIイベント発生時にmgr各種が使われるため。)\r
212                         //-----------------\r
213                         #endregion\r
214 \r
215                         #region [ チップパレットウィンドウの初期位置を変更する。(読み込んだアプリ設定に合わせる。)]\r
216                         //-----------------\r
217                         this.dlgチップパレット.Left = this.Left + ( ( this.Width - this.dlgチップパレット.Width ) / 2 );\r
218                         this.dlgチップパレット.Top = this.Top + ( ( this.Height - this.dlgチップパレット.Height ) / 2 );\r
219                         //-----------------\r
220                         #endregion\r
221 \r
222                         #region [ [ファイル]メニューに、最近使ったファイルを追加する。]\r
223                         //-----------------\r
224                         this.t最近使ったファイルをFileメニューへ追加する();\r
225                         //-----------------\r
226                         #endregion\r
227 \r
228 \r
229                         // ファイル指定があればそれを開く。\r
230 \r
231                         #region [ コマンドライン引数にファイルの指定があるならそれを開く。 ]\r
232                         //-----------------\r
233                         string[] commandLineArgs = Environment.GetCommandLineArgs();\r
234                         if( ( commandLineArgs.Length > 1 ) && File.Exists( commandLineArgs[ 1 ] ) )\r
235                                 this.t演奏ファイルを開いて読み込む( commandLineArgs[ 1 ] );\r
236                         //-----------------\r
237                         #endregion\r
238                 }\r
239                 private void tアプリ終了時に行う終了処理()\r
240                 {\r
241                         #region [ アプリ設定ファイル (DTXCreatorSetting.config) を保存する。]\r
242                         //-----------------\r
243                         this.tアプリ設定の保存();\r
244                         //-----------------\r
245                         #endregion\r
246 \r
247                         #region [ 各管理者で必要な終了処理を行う。]\r
248                         //-----------------\r
249                         this.mgrWAVリスト管理者.tDirectSoundの解放();\r
250                         //-----------------\r
251                         #endregion\r
252 \r
253                         #region [ Viewer再生用一時DTX生成オブジェクトの終了処理を行う。 ]\r
254                         makeTempDTX.Dispose();\r
255                         makeTempDTX = null;\r
256                         #endregion\r
257                 }\r
258                 private void tアプリ設定の読み込み()\r
259                 {\r
260                         string str設定ファイル名 =\r
261                                 this.strDTXCのあるフォルダ名 + @"DTXCreatorSetting.config";\r
262 \r
263 \r
264                         // 読み込む。\r
265 \r
266                         #region [ アプリ設定ファイルを読み込む。 → 失敗したら内容リセットして継続する。]\r
267                         //-----------------\r
268                         if( File.Exists( str設定ファイル名 ) )\r
269                         {\r
270                                 try\r
271                                 {\r
272                                         // アプリ設定ファイル(XML形式)を this.appアプリ設定 に読み込む。\r
273 \r
274                                         var serializer = new XmlSerializer( typeof( AppSetting ) );\r
275                                         var stream = new FileStream( str設定ファイル名, FileMode.Open );\r
276                                         this.appアプリ設定 = (AppSetting) serializer.Deserialize( stream );\r
277                                         stream.Close();\r
278                                 }\r
279                                 catch( Exception )\r
280                                 {\r
281                                         // 失敗時:内容をリセットして継続する。\r
282 \r
283                                         this.appアプリ設定 = new AppSetting();\r
284                                 }\r
285 \r
286 \r
287                                 // 反復要素とか足りなかったりしてもリセットする。\r
288 \r
289                                 if( this.appアプリ設定.SoundListColumnWidth.Length != 5\r
290                                         || this.appアプリ設定.GraphicListColumnWidth.Length != 4\r
291                                         || this.appアプリ設定.MovieListColumnWidth.Length != 3\r
292                                         || !this.appアプリ設定.bSameVersion() )\r
293                                 {\r
294                                         this.appアプリ設定 = new AppSetting();\r
295                                 }\r
296 \r
297 \r
298                                 // 内容の妥当性を確認する。\r
299 \r
300                                 this.appアプリ設定.Confirm();\r
301                         }\r
302                         //-----------------\r
303                         #endregion\r
304 \r
305 \r
306                         // 読み込んだアプリ設定を DTXCreator に反映する。\r
307 \r
308                         #region [ ウィンドウの位置とサイズ ]\r
309                         //-----------------\r
310                         this.SetDesktopBounds( this.appアプリ設定.X, this.appアプリ設定.Y, this.appアプリ設定.Width, this.appアプリ設定.Height );\r
311                         //-----------------\r
312                         #endregion\r
313                         #region [ 最大化 ]\r
314                         //-----------------\r
315                         if( this.appアプリ設定.Maximized )\r
316                                 this.WindowState = FormWindowState.Maximized;\r
317                         //-----------------\r
318                         #endregion\r
319                         #region [ タブ(左側)と譜面(右側)の表示幅の割合 ]\r
320                         //-----------------\r
321                         this.splitContainerタブと譜面を分割.SplitterDistance =\r
322                                 this.appアプリ設定.SplitterDistance;\r
323                         //-----------------\r
324                         #endregion\r
325                         #region [ WAV・BMP・AVIリストの各列の幅 ]\r
326                         //-----------------\r
327                         for( int i = 0; i < 5; i++ )\r
328                                 this.listViewWAVリスト.Columns[ i ].Width = this.appアプリ設定.SoundListColumnWidth[ i ];\r
329 \r
330                         for( int i = 0; i < 4; i++ )\r
331                                 this.listViewBMPリスト.Columns[ i ].Width = this.appアプリ設定.GraphicListColumnWidth[ i ];\r
332 \r
333                         for( int i = 0; i < 3; i++ )\r
334                                 this.listViewAVIリスト.Columns[ i ].Width = this.appアプリ設定.MovieListColumnWidth[ i ];\r
335                         //-----------------\r
336                         #endregion\r
337                         #region [ 譜面拡大率 ]\r
338                         //-----------------\r
339                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
340                         this.toolStripComboBox譜面拡大率.SelectedIndex =\r
341                                 this.appアプリ設定.HViewScaleIndex;\r
342                         //-----------------\r
343                         #endregion\r
344                         #region [ ガイド間隔 ]\r
345                         //-----------------\r
346                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
347                         this.toolStripComboBoxガイド間隔.SelectedIndex =\r
348                                 this.appアプリ設定.GuideIndex;\r
349                         //-----------------\r
350                         #endregion\r
351                         #region [ 演奏速度 ]\r
352                         //-----------------\r
353                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
354                         this.toolStripComboBox演奏速度.SelectedIndex = 5;\r
355                         //-----------------\r
356                         #endregion\r
357                         #region [ 作業フォルダ ]\r
358                         //-----------------\r
359                         this.str作業フォルダ名 =\r
360                                 this.appアプリ設定.LastWorkFolder;\r
361                         \r
362                         if( Directory.Exists( this.str作業フォルダ名 ) )\r
363                         {\r
364                                 //Directory.SetCurrentDirectory( this.str作業フォルダ名 );               // #35399: 2015/8/15 カレントディレクトリを変更すると、.NET4以降用にbuildしたDTXMania本体での再生に失敗するため、カレントディレクトリの変更を中止する\r
365                                 // #35399: ただし作業フォルダは維持する(書き設定行は不要だが、if分岐は残す必要あり)\r
366                                 // this.str作業フォルダ名 = this.appアプリ設定.LastWorkFolder;      \r
367                         }\r
368                         else\r
369                         {\r
370                                 // 作業フォルダが既になくなってる場合はカレントフォルダを適用。\r
371 \r
372                                 this.str作業フォルダ名 = Directory.GetCurrentDirectory();\r
373                         }\r
374                         //-----------------\r
375                         #endregion\r
376                         #region [ レーン表示/非表示の反映 #26005 2011.8.29 yyagi; added ]\r
377                         for ( int i = 0; i < this.appアプリ設定.LanesInfo.Count; i++ )\r
378                         {\r
379                                 for ( int j = 0; j < this.mgr譜面管理者.listレーン.Count; j++ )\r
380                                 {\r
381                                         if ( this.mgr譜面管理者.listレーン[ j ].strレーン名 == this.appアプリ設定.LanesInfo[ i ].Name )\r
382                                         {\r
383                                                 this.mgr譜面管理者.listレーン[ j ].bIsVisible = this.appアプリ設定.LanesInfo[ i ].Checked;\r
384                                                 break;\r
385                                         }\r
386                                 }\r
387                         }\r
388                         this.mgr譜面管理者.tRefreshDisplayLanes();\r
389                         #endregion\r
390                         #region [ 選択モード/編集モードの設定 ]\r
391                         if ( this.appアプリ設定.InitialOperationMode )\r
392                         {\r
393                                 this.t選択モードにする();\r
394                         }\r
395                         else\r
396                         {\r
397                                 this.t編集モードにする();\r
398                         }\r
399                         #endregion\r
400                 }\r
401                 private void tアプリ設定の保存()\r
402                 {\r
403                         string str設定ファイル名 = \r
404                                 this.strDTXCのあるフォルダ名 + @"DTXCreatorSetting.config";\r
405 \r
406 \r
407                         // DTXCreator から保存すべきアプリ設定を取得する。\r
408 \r
409                         #region [ #23729 2010.11.22 yyagi: to get DTXC's x, y, width & height correctly, set windowstate "normal" if it is "minimized." ]\r
410                         if (this.WindowState == FormWindowState.Minimized)\r
411                         {\r
412                                 this.WindowState = FormWindowState.Normal;\r
413                         }\r
414                         #endregion\r
415                         #region [ ウィンドウの位置とサイズ ]\r
416                         //-----------------\r
417                         this.appアプリ設定.X = this.Location.X;\r
418                         this.appアプリ設定.Y = this.Location.Y;\r
419                         this.appアプリ設定.Width = this.Width;\r
420                         this.appアプリ設定.Height = this.Height;\r
421                         //-----------------\r
422                         #endregion\r
423                         #region [ 最大化 ]\r
424                         //-----------------\r
425                         this.appアプリ設定.Maximized =\r
426                                 ( this.WindowState == FormWindowState.Maximized ) ? true : false;\r
427                         //-----------------\r
428                         #endregion\r
429                         #region [ タブ(左側)と譜面(右側)の表示幅の割合 ]\r
430                         //-----------------\r
431                         this.appアプリ設定.SplitterDistance =\r
432                                 this.splitContainerタブと譜面を分割.SplitterDistance;\r
433                         //-----------------\r
434                         #endregion\r
435                         #region [ WAV・BMP・AVIリストの各列の幅 ]\r
436                         //-----------------\r
437                         for( int i = 0; i < 5; i++ )\r
438                                 this.appアプリ設定.SoundListColumnWidth[ i ] = this.listViewWAVリスト.Columns[ i ].Width;\r
439 \r
440                         for( int i = 0; i < 4; i++ )\r
441                                 this.appアプリ設定.GraphicListColumnWidth[ i ] = this.listViewBMPリスト.Columns[ i ].Width;\r
442 \r
443                         for( int i = 0; i < 3; i++ )\r
444                                 this.appアプリ設定.MovieListColumnWidth[ i ] = this.listViewAVIリスト.Columns[ i ].Width;\r
445                         //-----------------\r
446                         #endregion\r
447                         #region [ 譜面拡大率 ]\r
448                         //-----------------\r
449                         this.appアプリ設定.HViewScaleIndex =\r
450                                 this.toolStripComboBox譜面拡大率.SelectedIndex;\r
451                         //-----------------\r
452                         #endregion\r
453                         #region [ ガイド間隔 ]\r
454                         //-----------------\r
455                         this.appアプリ設定.GuideIndex =\r
456                                 this.toolStripComboBoxガイド間隔.SelectedIndex;\r
457                         //-----------------\r
458                         #endregion\r
459                         #region [ 作業フォルダ ]\r
460                         //-----------------\r
461                         this.appアプリ設定.LastWorkFolder =\r
462                                 this.str作業フォルダ名;\r
463                         //-----------------\r
464                         #endregion\r
465                         #region [ レーン表示/非表示 #26005 2011.8.29 yyagi; added ]\r
466                         this.appアプリ設定.LanesInfo.Clear();\r
467                         foreach ( DTXCreator.譜面.Cレーン c in this.mgr譜面管理者.listレーン )\r
468                         {\r
469                                 this.appアプリ設定.AddLanesInfo( c.strレーン名, c.bIsVisible );\r
470                         }\r
471                         #endregion\r
472 \r
473 \r
474                         // 保存する。\r
475 \r
476                         #region [ アプリ設定をXML形式ファイルで出力する。 ]\r
477                         //-----------------\r
478                         var serializer = new XmlSerializer( typeof( AppSetting ) );\r
479                         using ( var stream = new FileStream( str設定ファイル名, FileMode.Create ) )              // #33204 2014.2.13 yyagi usingを使って、エラー発生時のファイルロックを回避\r
480                         {\r
481                                 serializer.Serialize( (Stream) stream, this.appアプリ設定 );\r
482                         }\r
483                         //-----------------\r
484                         #endregion\r
485                 }\r
486                 //-----------------\r
487                 #endregion\r
488                 #region [ 新規作成 ]\r
489                 //-----------------\r
490                 public void tシナリオ_新規作成()\r
491                 {\r
492                         // 作成前の保存確認。\r
493 \r
494                         #region [ 未保存なら保存する。→ キャンセルされた場合はここで中断。]\r
495                         //-----------------\r
496                         if( this.t未保存なら保存する() == DialogResult.Cancel )\r
497                                 return; // 中断\r
498                         //-----------------\r
499                         #endregion\r
500 \r
501 \r
502                         // 新規作成。\r
503 \r
504                         #region [「初期化中です」ポップアップを表示する。]\r
505                         //-----------------\r
506                         this.dlgチップパレット.t一時的に隠蔽する();\r
507 \r
508                         Cメッセージポップアップ msg\r
509                                 = new Cメッセージポップアップ( Resources.str初期化中ですMSG + Environment.NewLine + Resources.strしばらくお待ち下さいMSG );\r
510                         msg.Owner = this;\r
511                         msg.Show();\r
512                         msg.Refresh();\r
513                         //-----------------\r
514                         #endregion\r
515 \r
516                         this.t譜面を初期化する();\r
517 \r
518                         #region [「初期化中です」ポップアップを閉じる。]\r
519                         //-----------------\r
520                         msg.Close();\r
521                         this.dlgチップパレット.t一時的な隠蔽を解除する();\r
522 \r
523                         this.Refresh();                 // リスト内容等を消すために再描画\r
524                         //-----------------\r
525                         #endregion\r
526                 }\r
527                 private void t譜面を初期化する()\r
528                 {\r
529                         this.strDTXファイル名 = "";\r
530 \r
531                         // 画面項目の初期化。\r
532 \r
533                         #region [ 基本情報タブの初期化 ]\r
534                         //-----------------\r
535                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBox曲名.Clear();\r
536                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBox製作者.Clear();\r
537                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBoxGenre.Clear();\r
538                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBoxコメント.Clear();\r
539                         CUndoRedo管理.bUndoRedoした直後 = true;   this.numericUpDownBPM.Value = 120.0M;\r
540                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBoxDLEVEL.Text = "50";\r
541                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBoxGLEVEL.Text = "0";\r
542                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBoxBLEVEL.Text = "0";\r
543                         CUndoRedo管理.bUndoRedoした直後 = true;   this.hScrollBarDLEVEL.Value = 50;\r
544                         CUndoRedo管理.bUndoRedoした直後 = true;   this.hScrollBarGLEVEL.Value = 0;\r
545                         CUndoRedo管理.bUndoRedoした直後 = true;   this.hScrollBarBLEVEL.Value = 0;\r
546                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBoxパネル.Clear();\r
547                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBoxPREVIEW.Clear();\r
548                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBoxPREIMAGE.Clear();\r
549                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBoxSTAGEFILE.Clear();\r
550                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBoxBACKGROUND.Clear();\r
551                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBoxRESULTIMAGE.Clear();\r
552                         CUndoRedo管理.bUndoRedoした直後 = true; this.check556x710BGAAVI.Checked = false;\r
553                         //-----------------\r
554                         #endregion\r
555                         \r
556                         #region [ WAVタブ・BMPタブ・AVIタブの初期化 ]\r
557                         //-----------------\r
558                         this.listViewWAVリスト.Items.Clear();\r
559                         this.mgrWAVリスト管理者 = new CWAVリスト管理( this, this.listViewWAVリスト );\r
560 \r
561                         this.listViewBMPリスト.Items.Clear();\r
562                         this.mgrBMPリスト管理者 = new CBMPリスト管理( this, this.listViewBMPリスト );\r
563 \r
564                         this.listViewAVIリスト.Items.Clear();\r
565                         this.mgrAVIリスト管理者 = new CAVIリスト管理( this, this.listViewAVIリスト );\r
566 \r
567                         this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( 0 );\r
568                         //-----------------\r
569                         #endregion\r
570                         \r
571                         #region [ 自由入力タブの初期化 ]\r
572                         //-----------------\r
573                         CUndoRedo管理.bUndoRedoした直後 = true;   this.textBox自由入力欄.Clear();\r
574                         //-----------------\r
575                         #endregion\r
576 \r
577                         #region [ チップパレットの初期化 ]\r
578                         //-----------------\r
579                         if( this.dlgチップパレット != null )\r
580                                 this.dlgチップパレット.Close();\r
581 \r
582                         this.dlgチップパレット = new Cチップパレット( this );\r
583                         this.dlgチップパレット.Left = this.Left + ( this.Width - this.dlgチップパレット.Width ) / 2;\r
584                         this.dlgチップパレット.Top = this.Top + ( this.Height - this.dlgチップパレット.Height ) / 2;\r
585                         this.dlgチップパレット.Owner = this;\r
586 \r
587                         if( this.toolStripButtonチップパレット.CheckState == CheckState.Checked )\r
588                                 this.dlgチップパレット.t表示する();\r
589                         //-----------------\r
590                         #endregion\r
591 \r
592                         #region [ 譜面の生成・初期化 ]\r
593                         //-----------------\r
594                         if ( this.mgr譜面管理者 == null )          // 初回起動時は、レーン表示有無の構成に初期値を使用(して、後でDTXCreatorConfig.settingsのものに置き換える)\r
595                         {\r
596                                 this.mgr譜面管理者 = new C譜面管理( this );\r
597                                 this.mgr譜面管理者.t初期化();\r
598                         }\r
599                         else                                                                    // 起動後のdtxファイル読み込み等の場合は、直前のレーン表示有無の構成を踏襲する\r
600                         {\r
601                                 #region [ レーン表示/非表示状態の待避 #26005 2011.8.30 yyagi; added ]\r
602                                 List<Cレーン> lc = new List<Cレーン>(this.mgr譜面管理者.listレーン);\r
603                                 #endregion\r
604 \r
605                                 this.mgr譜面管理者 = new C譜面管理( this );\r
606                                 this.mgr譜面管理者.t初期化();\r
607 \r
608                                 #region [ レーン表示/非表示の反映 #26005 2011.8.30 yyagi; added ]\r
609                                 for ( int i = 0; i < this.mgr譜面管理者.listレーン.Count; i++ )\r
610                                 {\r
611                                         this.mgr譜面管理者.listレーン[ i ].bIsVisible = lc[ i ].bIsVisible;\r
612                                 }\r
613                                 this.mgr譜面管理者.tRefreshDisplayLanes();\r
614                                 #endregion\r
615                         }\r
616                         //-----------------\r
617                         #endregion\r
618 \r
619                         #region [ DTXViewer 関連 GUI の初期化 ]\r
620                         //-----------------\r
621                         this.tDTXV演奏関連のボタンとメニューのEnabledの設定();\r
622                         //-----------------\r
623                         #endregion\r
624 \r
625                         #region [ ガイド間隔の初期値を設定する。]\r
626                         //-----------------\r
627                         this.tガイド間隔を変更する( 16 );\r
628                         //-----------------\r
629                         #endregion\r
630 \r
631 \r
632                         // 内部処理の初期化。\r
633 \r
634                         #region [ Undo/Redoリストのリセット ]\r
635                         //-----------------\r
636                         this.mgrUndoRedo管理者 = new CUndoRedo管理();\r
637 \r
638                         CUndoRedo管理.bUndoRedoした直後 = false;\r
639                         this.tUndoRedo用GUIの有効無効を設定する();\r
640                         //-----------------\r
641                         #endregion\r
642 \r
643                         #region [ 「2大モード」の管理者を生成、初期モードは、設定値から取得する・・・が、起動時は譜面生成後に設定値を読みだすので、設定値読み出し後に再設定すること。。]\r
644                         //-----------------\r
645                         this.mgr選択モード管理者 = new C選択モード管理( this );\r
646                         this.mgr編集モード管理者 = new C編集モード管理( this );\r
647 \r
648                         if ( this.appアプリ設定.InitialOperationMode )\r
649                         {\r
650                                 this.t選択モードにする();\r
651                         }\r
652                         else\r
653                         {\r
654                                 this.t編集モードにする();\r
655                         }\r
656                         //-----------------\r
657                         #endregion\r
658 \r
659 \r
660                         // 上記のプロパティ変更操作により未保存フラグがtrueになってしまってるので、元に戻す。\r
661 \r
662                         #region [ 未保存フラグをクリアする。]\r
663                         //-----------------\r
664                         this.b未保存 = false;\r
665                         //-----------------\r
666                         #endregion\r
667                         #region [ 再生制御用フラグを立てる。(DTXVに必ずリロードさせるため) ]\r
668                         //-----------------\r
669                         this.bDTXファイルを開いた = true;\r
670                         //-----------------\r
671                         #endregion\r
672                 }\r
673                 //-----------------\r
674                 #endregion\r
675                 #region [ 開く ]\r
676                 //-----------------\r
677                 private void tシナリオ_開く()\r
678                 {\r
679                         // 作成前の保存確認。\r
680 \r
681                         #region [ 未保存なら保存する。→ キャンセルされた場合はここで中断。]\r
682                         //-----------------\r
683                         if( this.t未保存なら保存する() == DialogResult.Cancel )\r
684                                 return; // 中断\r
685                         //-----------------\r
686                         #endregion\r
687 \r
688 \r
689                         // 開くファイルを選択させる。\r
690 \r
691                         #region [ 「ファイルを開く」ダイアログでファイルを選択する。 ]\r
692                         //-----------------\r
693                         this.dlgチップパレット.t一時的に隠蔽する();\r
694 \r
695                         OpenFileDialog dialog = new OpenFileDialog();\r
696                         dialog.Title = Resources.strDTXファイル選択ダイアログのタイトル;\r
697                         dialog.Filter = Resources.strDTXファイル選択ダイアログのフィルタ;\r
698                         dialog.FilterIndex = 1;\r
699                         dialog.InitialDirectory = this.str作業フォルダ名;\r
700                         DialogResult result = dialog.ShowDialog();\r
701 \r
702                         this.dlgチップパレット.t一時的な隠蔽を解除する();\r
703                         this.Refresh();     // メインフォームを再描画してダイアログを完全に消す\r
704 \r
705                         if( result != DialogResult.OK )\r
706                                 return;\r
707                         //-----------------\r
708                         #endregion\r
709 \r
710 \r
711                         // 選択されたファイルを読み込む。\r
712 \r
713                         #region [ ファイルを読み込む。]\r
714                         //-----------------\r
715                         this.t演奏ファイルを開いて読み込む( dialog.FileName );\r
716                         //-----------------\r
717                         #endregion\r
718                 }\r
719                 private void tシナリオ_DragDropされたファイルを開く( string[] DropFiles )\r
720                 {\r
721                         // 開くファイルを決定する。\r
722 \r
723                         #region [ Dropされたファイルが複数個ある → 先頭のファイルだけを有効とする。 ]\r
724                         //-----------------\r
725                         string strファイル名 = DropFiles[ 0 ];\r
726                         //-----------------\r
727                         #endregion\r
728 \r
729 \r
730                         // 開く前の保存確認。\r
731 \r
732                         #region [ 未保存なら保存する。→ キャンセルされた場合はここで中断。]\r
733                         //-----------------\r
734                         if( this.t未保存なら保存する() == DialogResult.Cancel )\r
735                                 return; // 中断\r
736                         //-----------------\r
737                         #endregion\r
738 \r
739 \r
740                         // Drop されたファイルを読み込む。\r
741 \r
742                         #region [ ファイルを読み込む。]\r
743                         //-----------------\r
744                         string strExt = Path.GetExtension( strファイル名 ).ToLower();\r
745                         Debug.WriteLine( "ext=" + strExt );\r
746 \r
747                         if ( strExt.Equals(".dtx") )\r
748                         {\r
749                                 this.t演奏ファイルを開いて読み込む( strファイル名 );\r
750                         }\r
751                         else if (strExt.Equals(".smf") || strExt.Equals(".mid"))\r
752                         {\r
753                                 this.mgrMIDIインポート管理者.tMIDIインポート管理を開く( strファイル名 );\r
754                                 this.mgr譜面管理者.tRefreshDisplayLanes(); // レーンの表示/非表示切り替えに備えて追加\r
755                         }\r
756                         else\r
757                         {\r
758                                 MessageBox.Show(\r
759                                         Resources.strDTXファイルではありませんMSG,\r
760                                         Resources.str確認ダイアログのタイトル,\r
761                                         MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
762 \r
763                                 return; // 中断\r
764                         }\r
765                         //-----------------\r
766                         #endregion\r
767                 }\r
768                 private void t演奏ファイルを開いて読み込む( string strファイル名 )\r
769                 {\r
770                         // 前処理。\r
771 \r
772                         #region [ ファイルの存在を確認する。なかったらその旨を表示して中断する。]\r
773                         //-----------------\r
774                         if( !File.Exists( strファイル名 ) )\r
775                         {\r
776                                 MessageBox.Show(\r
777                                         Resources.strファイルが存在しませんMSG,\r
778                                         Resources.str確認ダイアログのタイトル,\r
779                                         MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1 );\r
780 \r
781                                 return; // 中断\r
782                         }\r
783                         //-----------------\r
784                         #endregion\r
785 \r
786                         #region [ 拡張子からデータ種別を判定する。]\r
787                         //-----------------\r
788                         \r
789                         CDTX入出力.E種別 e種別 = CDTX入出力.E種別.DTX;\r
790 \r
791                         string str拡張子 = Path.GetExtension( strファイル名 );\r
792 \r
793                         if( str拡張子.Equals( ".dtx", StringComparison.OrdinalIgnoreCase ) )\r
794                         {\r
795                                 e種別 = CDTX入出力.E種別.DTX;\r
796                         }\r
797                         else if( str拡張子.Equals( ".gda", StringComparison.OrdinalIgnoreCase ) )\r
798                         {\r
799                                 e種別 = CDTX入出力.E種別.GDA;\r
800                         }\r
801                         else if( str拡張子.Equals( ".g2d", StringComparison.OrdinalIgnoreCase ) )\r
802                         {\r
803                                 e種別 = CDTX入出力.E種別.G2D;\r
804                         }\r
805                         else if( str拡張子.Equals( ".bms", StringComparison.OrdinalIgnoreCase ) )\r
806                         {\r
807                                 e種別 = CDTX入出力.E種別.BMS;\r
808                         }\r
809                         else if( str拡張子.Equals( ".bme", StringComparison.OrdinalIgnoreCase ) )\r
810                         {\r
811                                 e種別 = CDTX入出力.E種別.BME;\r
812                         }\r
813                         else\r
814                         {\r
815                                 MessageBox.Show(\r
816                                         Resources.strDTXファイルではありませんMSG,\r
817                                         Resources.str確認ダイアログのタイトル,\r
818                                         MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
819 \r
820                                 return; // 中断\r
821                         }\r
822                         //-----------------\r
823                         #endregion\r
824 \r
825                         this.dlgチップパレット.t一時的に隠蔽する();\r
826 \r
827                         #region [「読み込み中です」ポップアップを表示する。]\r
828                         //-----------------\r
829                         Cメッセージポップアップ msg\r
830                                 = new Cメッセージポップアップ( Resources.str読み込み中ですMSG + Environment.NewLine + Resources.strしばらくお待ち下さいMSG );\r
831                         msg.Owner = this;\r
832                         msg.Show();\r
833                         msg.Refresh();\r
834                         //-----------------\r
835                         #endregion\r
836 \r
837 \r
838                         // 読み込む。\r
839 \r
840 \r
841                         this.t譜面を初期化する();\r
842 \r
843                         #region [ DTXファイルを読み込む。]\r
844                         //-----------------\r
845 \r
846                         // 全部を1つの string として読み込む。\r
847 \r
848                         StreamReader reader = new StreamReader( strファイル名, Encoding.GetEncoding( 932/*Shift-JIS*/ ) );\r
849                         string str全入力文字列 = reader.ReadToEnd();\r
850                         reader.Close();\r
851 \r
852 \r
853                         // その string から DTX データを読み込む。\r
854 \r
855                         new CDTX入出力( this ).tDTX入力( e種別, ref str全入力文字列 );\r
856 \r
857 \r
858                         // ファイル名、作業フォルダ名を更新する。\r
859 \r
860                         this.strDTXファイル名 = Path.ChangeExtension( Path.GetFileName( strファイル名 ), ".dtx" );            // 拡張子は強制的に .dtx に変更。\r
861                         this.str作業フォルダ名 = Path.GetDirectoryName( strファイル名 ) + @"\";             // 読み込み後、カレントフォルダは、作業ファイルのあるフォルダに移動する。\r
862                                                                                                                                                                                 // #35399: カレントディレクトリの変更はしない。.NET4以降でbuildしたDTXMania本体で再生できなくなるため。\r
863                         //-----------------\r
864                         #endregion\r
865 \r
866                         #region [ 読み込んだファイルを [ファイル]メニューの最近使ったファイル一覧に追加する。]\r
867                         //-----------------\r
868                         this.appアプリ設定.AddRecentUsedFile( this.str作業フォルダ名 + this.strDTXファイル名 );\r
869                         this.t最近使ったファイルをFileメニューへ追加する();\r
870                         //-----------------\r
871                         #endregion\r
872 \r
873                         #region [ DTX以外を読み込んだ場合は、(DTXに変換されているので)最初から未保存フラグを立てる。]\r
874                         //-----------------\r
875                         if( e種別 != CDTX入出力.E種別.DTX )\r
876                                 this.b未保存 = true;\r
877                         //-----------------\r
878                         #endregion\r
879 \r
880 \r
881                         #region [「読み込み中です」ポップアップを閉じる。 ]\r
882                         //-----------------\r
883                         msg.Close();\r
884                         this.Refresh(); // リスト内容等を消すために再描画する。\r
885                         //-----------------\r
886                         #endregion\r
887 \r
888                         #region [ 未保存フラグをクリアする。]\r
889                         //-----------------\r
890                         this.b未保存 = true; // ウィンドウタイトルを書き換えるため、一度未保存フラグをtrueにして b未保存の setter を作動させる。\r
891                         this.b未保存 = false;\r
892                         //-----------------\r
893                         #endregion\r
894                 }\r
895                 //-----------------\r
896                 #endregion\r
897                 #region [ 上書き保存/名前をつけて保存 ]\r
898                 //-----------------\r
899                 private void tシナリオ_上書き保存()\r
900                 {\r
901                         // 前処理。\r
902                         bool bDoSave = true;\r
903 \r
904                         this.dlgチップパレット.t一時的に隠蔽する();\r
905 \r
906                         #region [「保存中です」ポップアップを表示する。 ]\r
907                         //-----------------\r
908                         var msg = new Cメッセージポップアップ( Resources.str保存中ですMSG + Environment.NewLine + Resources.strしばらくお待ち下さいMSG );\r
909                         msg.Owner = this;\r
910                         msg.Show();\r
911                         msg.Refresh();\r
912                         //-----------------\r
913                         #endregion\r
914 \r
915                         #region [ ファイル名がない → 初めての保存と見なし、ファイル保存ダイアログで保存ファイル名を指定させる。 ]\r
916                         //-----------------\r
917                         if( string.IsNullOrEmpty( this.strDTXファイル名 ) )\r
918                         {\r
919                                 // ダイアログでファイル名を取得する。\r
920 \r
921                                 string str絶対パスファイル名 = this.tファイル保存ダイアログを開いてファイル名を取得する();\r
922 \r
923                                 if (string.IsNullOrEmpty(str絶対パスファイル名))\r
924                                 {\r
925                                         bDoSave = false;\r
926                                 }\r
927                                 else\r
928                                 {\r
929                                         //this.str作業フォルダ名 = Directory.GetCurrentDirectory() + @"\";       // ダイアログでディレクトリを変更した場合、カレントディレクトリも変更されている。\r
930                                         this.str作業フォルダ名 = Path.GetDirectoryName(str絶対パスファイル名) + @"\";\r
931                                         this.strDTXファイル名 = Path.GetFileName(str絶対パスファイル名);\r
932 \r
933                                         // WAV・BMP・AVIリストにあるすべてのファイル名を、作業フォルダに対する相対パスに変換する。\r
934                                         this.mgrWAVリスト管理者.tファイル名の相対パス化(this.str作業フォルダ名);\r
935                                         this.mgrBMPリスト管理者.tファイル名の相対パス化(this.str作業フォルダ名);\r
936                                         this.mgrAVIリスト管理者.tファイル名の相対パス化(this.str作業フォルダ名);\r
937                                 }\r
938                         }\r
939                         //-----------------\r
940                         #endregion\r
941 \r
942                         // DTXファイルへ出力。\r
943                         if (bDoSave)\r
944                         {\r
945 \r
946                                 #region [ 選択モードだったなら選択を解除する。]\r
947                                 //-----------------\r
948                                 if (this.b選択モードである)\r
949                                         this.mgr選択モード管理者.t全チップの選択を解除する();\r
950                                 //-----------------\r
951                                 #endregion\r
952 \r
953                                 #region [ DTXファイルを出力する。]\r
954                                 //-----------------\r
955                                 var sw = new StreamWriter(this.str作業フォルダ名 + this.strDTXファイル名, false, Encoding.GetEncoding("utf-16"));\r
956                                 new CDTX入出力(this).tDTX出力(sw);\r
957                                 sw.Close();\r
958                                 //-----------------\r
959                                 #endregion\r
960 \r
961                                 #region [ 出力したファイルのパスを、[ファイル]メニューの最近使ったファイル一覧に追加する。 ]\r
962                                 //-----------------\r
963                                 this.appアプリ設定.AddRecentUsedFile(this.str作業フォルダ名 + this.strDTXファイル名);\r
964                                 this.t最近使ったファイルをFileメニューへ追加する();\r
965                                 //-----------------\r
966                                 #endregion\r
967 \r
968                                 #region [ Viewer用の一時ファイルを削除する (修正+保存、直後のViewer再生時に、直前の修正が反映されなくなることへの対応) ]\r
969                                 tViewer用の一時ファイルを削除する();\r
970                                 #endregion\r
971 \r
972                                 // 後処理。\r
973                                 this.b未保存 = false;\r
974                         }\r
975 \r
976                         #region [「保存中です」ポップアップを閉じる。]\r
977                         //-----------------\r
978                         msg.Close();\r
979                         this.Refresh();         // リスト内容等を消すために再描画する。\r
980                         //-----------------\r
981                         #endregion\r
982 \r
983                         this.dlgチップパレット.t一時的な隠蔽を解除する();\r
984                 }\r
985                 private void tシナリオ_名前をつけて保存()\r
986                 {\r
987                         // 前処理。\r
988 \r
989                         #region [ ユーザに保存ファイル名を入力させる。]\r
990                         //-----------------\r
991                         // ファイル保存ダイアログを表示し、出力するファイル名を指定させる。キャンセルされたらここで中断。\r
992 \r
993                         string str絶対パスファイル名 = this.tファイル保存ダイアログを開いてファイル名を取得する();\r
994                         if( string.IsNullOrEmpty( str絶対パスファイル名 ) )\r
995                                 return; // 中断\r
996 \r
997 \r
998                         // フォルダ名とファイル名を更新。\r
999 \r
1000                         //this.str作業フォルダ名 = Directory.GetCurrentDirectory() + @"\";       // ダイアログでディレクトリを変更した場合は、カレントディレクトリも変更されている。\r
1001                         this.str作業フォルダ名 = Path.GetDirectoryName(str絶対パスファイル名) + @"\";\r
1002                         this.strDTXファイル名 = Path.GetFileName( str絶対パスファイル名 );\r
1003                         //-----------------\r
1004                         #endregion\r
1005 \r
1006                         #region [ WAV・BMP・AVIリストにあるすべてのファイル名を、作業フォルダに対する相対パスに変換する。 ]\r
1007                         //-----------------\r
1008                         this.mgrWAVリスト管理者.tファイル名の相対パス化( this.str作業フォルダ名 );\r
1009                         this.mgrBMPリスト管理者.tファイル名の相対パス化( this.str作業フォルダ名 );\r
1010                         this.mgrAVIリスト管理者.tファイル名の相対パス化( this.str作業フォルダ名 );\r
1011                         //-----------------\r
1012                         #endregion\r
1013 \r
1014 \r
1015                         // 保存する。\r
1016                         \r
1017                         this.tシナリオ_上書き保存();\r
1018 \r
1019 \r
1020                         // 後処理。\r
1021 \r
1022                         this.b未保存 = true; // ウィンドウタイトルに表示されているファイル名を変更するため一度 true にする。\r
1023                         this.b未保存 = false;\r
1024                 }\r
1025                 private string tファイル保存ダイアログを開いてファイル名を取得する()\r
1026                 {\r
1027                         // ダイアログでファイル名を取得。\r
1028 \r
1029                         this.dlgチップパレット.t一時的に隠蔽する();\r
1030 \r
1031                         var dialog = new SaveFileDialog() {\r
1032                                 Title = "名前をつけて保存",\r
1033                                 Filter = "DTXファイル(*.dtx)|*.dtx",\r
1034                                 FilterIndex = 1,\r
1035                                 InitialDirectory = this.str作業フォルダ名\r
1036                         };\r
1037                         DialogResult result = dialog.ShowDialog();\r
1038 \r
1039                         this.dlgチップパレット.t一時的な隠蔽を解除する();\r
1040 \r
1041 \r
1042                         // 画面を再描画。\r
1043 \r
1044                         this.Refresh();\r
1045 \r
1046 \r
1047                         // キャンセルされたら "" を返す。\r
1048 \r
1049                         if( result != DialogResult.OK )\r
1050                                 return "";\r
1051 \r
1052 \r
1053                         // ファイルの拡張子を .dtx に変更。\r
1054 \r
1055                         string fileName = dialog.FileName;\r
1056                         if( Path.GetExtension( fileName ).Length == 0 )\r
1057                                 fileName = Path.ChangeExtension( fileName, ".dtx" );\r
1058 \r
1059                         return fileName;\r
1060                 }\r
1061                 //-----------------\r
1062                 #endregion\r
1063                 #region [ 終了 ]\r
1064                 //-----------------\r
1065                 private void tシナリオ_終了()\r
1066                 {\r
1067                         // ウィンドウを閉じる。\r
1068 \r
1069                         this.Close();\r
1070                 }\r
1071                 //-----------------\r
1072                 #endregion\r
1073                 #region [ 検索/置換 ]\r
1074                 //-----------------\r
1075                 private void tシナリオ_検索()\r
1076                 {\r
1077                         this.mgr選択モード管理者.t検索する();       // モードによらず、検索はすべて選択モード管理者が行う。\r
1078                 }\r
1079                 private void tシナリオ_置換()\r
1080                 {\r
1081                         this.mgr選択モード管理者.t置換する();       // モードによらず、置換はすべて選択モード管理者が行う。\r
1082                 }\r
1083                 //-----------------\r
1084                 #endregion\r
1085                 #region [ 小節長変更/小節の挿入/小節の削除 ]\r
1086                 //-----------------\r
1087                 private void tシナリオ_小節長を変更する( C小節 cs )\r
1088                 {\r
1089                         // 前処理。\r
1090 \r
1091                         #region [ 小節長をユーザに入力させる。]\r
1092                         //-----------------\r
1093 \r
1094                         // 小節長ダイアログを表示し、小節長を取得する。\r
1095 \r
1096                         this.dlgチップパレット.t一時的に隠蔽する();\r
1097 \r
1098                         var dlg = new C小節長変更ダイアログ( cs.n小節番号0to3599 );\r
1099                         dlg.f倍率 = cs.f小節長倍率;\r
1100                         dlg.b後続変更 = false;\r
1101 \r
1102                         this.dlgチップパレット.t一時的な隠蔽を解除する();\r
1103 \r
1104 \r
1105                         // キャンセルされたらここで中断。\r
1106                         if( dlg.ShowDialog() != DialogResult.OK )\r
1107                                 return;\r
1108 \r
1109                         //-----------------\r
1110                         #endregion\r
1111 \r
1112 \r
1113                         // 小節長を変更。\r
1114 \r
1115                         //-----------------\r
1116                         int n変更開始小節番号 = cs.n小節番号0to3599;\r
1117                         int n変更終了小節番号 = ( dlg.b後続変更 ) ? this.mgr譜面管理者.n現在の最大の小節番号を返す() : cs.n小節番号0to3599;\r
1118 \r
1119                         #region [ BEATレーンをすべてバックアップ(コピー)しておく。小節長変更でBEATチップが削除されると困るので。]\r
1120                         int laneBEAT = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );\r
1121                         List<Cチップ> listBEATチップ = new List<Cチップ>();\r
1122                         foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )\r
1123                         {\r
1124                                 C小節 c小節 = pair.Value;\r
1125                                 for ( int index = 0; index < c小節.listチップ.Count; index++ )\r
1126                                 {\r
1127                                         if ( c小節.listチップ[ index ].nレーン番号0to == laneBEAT )\r
1128                                         {\r
1129                                                 listBEATチップ.Add( c小節.listチップ[ index ] );\r
1130                                         }\r
1131                                 }\r
1132                         }\r
1133                         #endregion\r
1134 \r
1135                         #region [ 小節長変更を実行する ]\r
1136                         for ( int n小節番号 = n変更開始小節番号; n小節番号 <= n変更終了小節番号; n小節番号++ )\r
1137                         {\r
1138                                 #region [ 指定した小節が存在しなければ、中断 ]\r
1139                                 C小節 c小節 = this.mgr譜面管理者.p小節を返す( n変更開始小節番号 );\r
1140                                 if ( c小節 == null )\r
1141                                 {\r
1142                                         return; // 中断\r
1143                                 }\r
1144                                 #endregion\r
1145 \r
1146                                 int n旧Grid数 = (int) ( c小節.f小節長倍率 * 192 + 0.5 );\r
1147                                 int n新Grid数 = (int) ( dlg.f倍率 * 192 + 0.5 );\r
1148                                 int nGrid増減 = n旧Grid数 - n新Grid数;\r
1149 \r
1150                                 this.t小節長を変更する_小節単位( n小節番号, dlg.f倍率 );\r
1151 \r
1152                                 // そして、Gridの増減があった分だけ、コピーしたBEATチップのGridを増減する\r
1153                                 int nGrid_BAR = this.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( n変更開始小節番号 );\r
1154                                 for ( int index = 0; index < listBEATチップ.Count; index++ )\r
1155                                 {\r
1156                                         // Gridを増減するのは、小節長変更した小節以降のチップだけ。\r
1157                                         // 更に、小節長変更した小節上では、新しい小節長で溢れた分のチップだけGridを増減する。\r
1158                                         // (この条件で、Grid数が増えた場合も対応できている)\r
1159                                         if ( \r
1160                                                 ( n小節番号 > n変更開始小節番号 ) ||\r
1161                                                 ( ( n小節番号 == n変更開始小節番号 ) && ( nGrid_BAR + n新Grid数 < listBEATチップ[ index ].n位置grid ) )\r
1162                                         )\r
1163                                         {\r
1164                                                 Cチップ cc = new Cチップ();\r
1165                                                 cc.tコピーfrom( listBEATチップ[ index ] );\r
1166                                                 cc.n位置grid += nGrid増減;\r
1167                                                 listBEATチップ[ index ] = cc;\r
1168                                         }\r
1169                                 }\r
1170 \r
1171                         }\r
1172                         #endregion\r
1173                         //-----------------\r
1174         \r
1175                         this.mgrUndoRedo管理者.tトランザクション記録を開始する();\r
1176 \r
1177                         #region [ BEATレーンのチップを全削除する ]\r
1178                         //this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBEAT );\r
1179                         //this.tシナリオ・削除();\r
1180                         foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )\r
1181                         {\r
1182                                 C小節 c小節 = pair.Value;\r
1183                                 for( int i = 0; i < c小節.listチップ.Count; i++ )\r
1184                                 {\r
1185                                         Cチップ cチップ = c小節.listチップ[ i ];\r
1186 \r
1187                                         if( cチップ.nレーン番号0to == laneBEAT )\r
1188                                         {\r
1189                                                 #region [ UndoRedo リストにこの操作(チップ削除)を記録する。]\r
1190                                                 //-----------------\r
1191                                                 var cc = new Cチップ();\r
1192                                                 cc.tコピーfrom( cチップ );\r
1193                                         \r
1194                                                 var ur = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cc );\r
1195 \r
1196                                                 this.mgrUndoRedo管理者.tノードを追加する(\r
1197                                                         new CUndoRedoセル<Cチップ配置用UndoRedo>( \r
1198                                                                 null, \r
1199                                                                 new DGUndoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のUndo ), \r
1200                                                                 new DGRedoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のRedo ),\r
1201                                                                 ur, ur ) );\r
1202                                                 //-----------------\r
1203                                                 #endregion\r
1204                 \r
1205                                                 // チップを小節のチップリストから削除する。\r
1206                                                 c小節.listチップ.RemoveAt( i );\r
1207 \r
1208                                                 // リストが更新されたので、最初のチップから見直す。\r
1209                                                 i = -1;\r
1210                                         }\r
1211                                 }\r
1212                         }\r
1213                         #endregion\r
1214 \r
1215                         #region [ コピーしておいた(そして、nGridを更新した))BEATチップを、BEATレーンに戻す ]\r
1216                         foreach ( Cチップ cチップ in listBEATチップ )\r
1217                         {\r
1218                                 this.mgr編集モード管理者.tBeatチップを配置する( cチップ.n位置grid, cチップ.n値_整数1to1295, cチップ.f値_浮動小数, cチップ.b裏 );\r
1219                         }\r
1220                         #endregion\r
1221 \r
1222                         // 後処理。\r
1223                         this.b未保存 = true;\r
1224                         this.mgrUndoRedo管理者.tトランザクション記録を終了する();\r
1225                         listBEATチップ.Clear();\r
1226                         listBEATチップ = null;\r
1227 \r
1228                         // 画面を再描画。\r
1229                         this.tUndoRedo用GUIの有効無効を設定する();\r
1230 \r
1231                 }\r
1232                 private void t小節長を変更する_小節単位( int n小節番号, float f倍率 )\r
1233                 {\r
1234                         // 対象の小節を取得。\r
1235 \r
1236                         #region [ 小節番号から小節オブジェクトを取得する。→ 指定された小節が存在しない場合はここで中断。]\r
1237                         //-----------------\r
1238                         \r
1239                         C小節 c小節 = this.mgr譜面管理者.p小節を返す( n小節番号 );\r
1240         \r
1241                         if( c小節 == null )\r
1242                                 return; // 中断\r
1243                         \r
1244                         //-----------------\r
1245                         #endregion\r
1246 \r
1247 \r
1248                         // 作業記録開始。\r
1249 \r
1250                         this.mgrUndoRedo管理者.tトランザクション記録を開始する();\r
1251 \r
1252                         #region [ UndoRedo リストにこの操作(小節長変更)を記録する。 ]\r
1253                         //-----------------\r
1254                         var ur変更前 = new C小節用UndoRedo( c小節.n小節番号0to3599, c小節.f小節長倍率 );\r
1255                         var ur変更後 = new C小節用UndoRedo( c小節.n小節番号0to3599, f倍率 );\r
1256 \r
1257                         this.mgrUndoRedo管理者.tノードを追加する( \r
1258                                 new CUndoRedoセル<C小節用UndoRedo>(\r
1259                                         null,\r
1260                                         new DGUndoを実行する<C小節用UndoRedo>( this.mgr譜面管理者.t小節長変更のUndo ),\r
1261                                         new DGRedoを実行する<C小節用UndoRedo>( this.mgr譜面管理者.t小節長変更のRedo ),\r
1262                                         ur変更前, ur変更後 ) );\r
1263                         //-----------------\r
1264                         #endregion\r
1265 \r
1266 \r
1267                         // 小節長倍率を変更。\r
1268 \r
1269                         #region [ 小節長倍率を変更する。]\r
1270                         //-----------------\r
1271                         c小節.f小節長倍率 = f倍率;\r
1272                         //-----------------\r
1273                         #endregion\r
1274 \r
1275                         #region [ 小節からはみ出したチップを削除する。チップの削除操作は Undo/Redo に記録する。]\r
1276 \r
1277                         //-----------------\r
1278                         for( int i = 0; i < c小節.listチップ.Count; i++ )\r
1279                         {\r
1280                                 Cチップ cチップ = c小節.listチップ[ i ];\r
1281 \r
1282                                 if( cチップ.n位置grid >= c小節.n小節長倍率を考慮した現在の小節の高さgrid )\r
1283                                 {\r
1284 \r
1285                                         #region [ UndoRedo リストにこの操作(チップ削除)を記録する。]\r
1286                                         //-----------------\r
1287                                         var cc = new Cチップ();\r
1288                                         cc.tコピーfrom( cチップ );\r
1289                                         \r
1290                                         var ur = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cc );\r
1291 \r
1292                                         this.mgrUndoRedo管理者.tノードを追加する(\r
1293                                                 new CUndoRedoセル<Cチップ配置用UndoRedo>( \r
1294                                                         null, \r
1295                                                         new DGUndoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のUndo ), \r
1296                                                         new DGRedoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のRedo ),\r
1297                                                         ur, ur ) );\r
1298                                         //-----------------\r
1299                                         #endregion\r
1300 \r
1301                 \r
1302                                         // チップを小節のチップリストから削除する。\r
1303 \r
1304                                         c小節.listチップ.RemoveAt( i );\r
1305 \r
1306 \r
1307                                         // リストが更新されたので、最初のチップから見直す。\r
1308                                         \r
1309                                         i = -1;\r
1310                                 }\r
1311                         }\r
1312                         //-----------------\r
1313                         #endregion\r
1314 \r
1315 \r
1316                         // 作業記録終了。\r
1317 \r
1318                         this.mgrUndoRedo管理者.tトランザクション記録を終了する();\r
1319 \r
1320 \r
1321                         // 画面を再描画。\r
1322 \r
1323                         this.tUndoRedo用GUIの有効無効を設定する();\r
1324                 }\r
1325                 private void tシナリオ_小節を挿入する( int n挿入位置の小節番号 )\r
1326                 {\r
1327                         // 作業を記録。\r
1328 \r
1329                         #region [ UndoRedo リストにこの操作(小節挿入)を記録する。]\r
1330                         //-----------------\r
1331                         this.mgrUndoRedo管理者.tノードを追加する(\r
1332                                 new CUndoRedoセル<int>(\r
1333                                         null, \r
1334                                         new DGUndoを実行する<int>( this.mgr譜面管理者.t小節挿入のUndo ),\r
1335                                         new DGRedoを実行する<int>( this.mgr譜面管理者.t小節挿入のRedo ),\r
1336                                         n挿入位置の小節番号, n挿入位置の小節番号 ) );\r
1337                         //-----------------\r
1338                         #endregion\r
1339 \r
1340 \r
1341                         // 小節を挿入。\r
1342                         \r
1343                         #region [ 挿入位置以降の小節を1つずつ後ろにずらす(小節番号を +1 していく)。 ]\r
1344                         //-----------------\r
1345                         for( int i = this.mgr譜面管理者.n現在の最大の小節番号を返す(); i >= n挿入位置の小節番号; i-- )\r
1346                         {\r
1347                                 // ずらす小節オブジェクトを取得する。\r
1348 \r
1349                                 C小節 cずらす小節 = this.mgr譜面管理者.p小節を返す( i );\r
1350                                 if( cずらす小節 == null )\r
1351                                         continue;\r
1352 \r
1353 \r
1354                                 // 小節番号を+1する。\r
1355                                 \r
1356                                 this.mgr譜面管理者.dic小節.Remove( i );          // 小節番号は Dictionary のキー値であるため、番号が変われば再登録が必要。\r
1357                                 cずらす小節.n小節番号0to3599 = i + 1;\r
1358                                 this.mgr譜面管理者.dic小節.Add( cずらす小節.n小節番号0to3599, cずらす小節 );\r
1359                         }\r
1360                         //-----------------\r
1361                         #endregion\r
1362 \r
1363                         #region [ 新しい小節を作成し、譜面の持つ小節リストに追加する。 ]\r
1364                         //-----------------\r
1365 \r
1366                         // 小節を該当位置に追加する。\r
1367 \r
1368                         this.mgr譜面管理者.dic小節.Add( n挿入位置の小節番号, new C小節( n挿入位置の小節番号 ) );\r
1369 \r
1370         \r
1371                         // 譜面を再描画する。\r
1372 \r
1373                         this.pictureBox譜面パネル.Refresh();\r
1374 \r
1375                         //-----------------\r
1376                         #endregion\r
1377 \r
1378 \r
1379                         // 後処理。\r
1380 \r
1381                         this.tUndoRedo用GUIの有効無効を設定する();\r
1382                         this.b未保存 = true;\r
1383                 }\r
1384                 private void tシナリオ_小節を削除する( int n削除位置の小節番号 )\r
1385                 {\r
1386                         // 作業記録開始。\r
1387 \r
1388                         this.mgrUndoRedo管理者.tトランザクション記録を開始する();\r
1389 \r
1390 \r
1391                         // 小節を削除。\r
1392 \r
1393                         #region [ 最大小節番号を取得する。]\r
1394                         //-----------------\r
1395                         int n最大小節番号 = this.mgr譜面管理者.n現在の最大の小節番号を返す();   // 小節を削除すると数が変わるので、削除前に取得する。\r
1396                         //-----------------\r
1397                         #endregion\r
1398                         #region [ 削除する小節オブジェクトを取得する。]\r
1399                         //-----------------\r
1400                         C小節 c削除する小節 = this.mgr譜面管理者.p小節を返す( n削除位置の小節番号 );\r
1401                         //-----------------\r
1402                         #endregion\r
1403 \r
1404                         #region [ その小節が持っているチップを全て削除する。チップの削除作業は、Undo/Redoリストに記録する。]\r
1405                         //-----------------\r
1406                         \r
1407                         while( c削除する小節.listチップ.Count > 0 )\r
1408                         {\r
1409                                 #region [ UndoRedo リストにこの操作(チップ削除)を記録する。]\r
1410                                 //-----------------\r
1411                                 var cc = new Cチップ();\r
1412                                 cc.tコピーfrom( c削除する小節.listチップ[ 0 ] );\r
1413                                 var redo = new Cチップ配置用UndoRedo( c削除する小節.n小節番号0to3599, cc );\r
1414 \r
1415                                 this.mgrUndoRedo管理者.tノードを追加する(\r
1416                                         new CUndoRedoセル<Cチップ配置用UndoRedo>(\r
1417                                                 null,\r
1418                                                 new DGUndoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のUndo ),\r
1419                                                 new DGRedoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のRedo ),\r
1420                                                 redo, redo ) );\r
1421                                 //-----------------\r
1422                                 #endregion\r
1423 \r
1424                                 // 小節からチップを削除する。\r
1425 \r
1426                                 c削除する小節.listチップ.RemoveAt( 0 );\r
1427                         }\r
1428                         \r
1429                         //-----------------\r
1430                         #endregion\r
1431 \r
1432                         #region [ UndoRedo リストにこの操作(小節削除)を記録する。]\r
1433                         //-----------------\r
1434                         this.mgrUndoRedo管理者.tノードを追加する(\r
1435                                 new CUndoRedoセル<int>( \r
1436                                         null, \r
1437                                         new DGUndoを実行する<int>( this.mgr譜面管理者.t小節削除のUndo ),\r
1438                                         new DGRedoを実行する<int>( this.mgr譜面管理者.t小節削除のRedo ),\r
1439                                         n削除位置の小節番号, n削除位置の小節番号 ) );\r
1440                         //-----------------\r
1441                         #endregion\r
1442                         #region [ 該当小節を譜面の小節リストから削除する。]\r
1443                         //-----------------\r
1444                         this.mgr譜面管理者.dic小節.Remove( n削除位置の小節番号 );\r
1445                         //-----------------\r
1446                         #endregion\r
1447                         #region [ 削除した小節より後方にある小節を1つずつ前にずらす。(小節番号を -1 していく)]\r
1448                         //-----------------\r
1449 \r
1450                         for( int i = n削除位置の小節番号 + 1; i <= n最大小節番号; i++ )\r
1451                         {\r
1452                                 // 小節オブジェクトを取得する。\r
1453 \r
1454                                 C小節 cずらす小節 = this.mgr譜面管理者.p小節を返す( i );\r
1455                                 if( cずらす小節 == null )\r
1456                                         continue;\r
1457 \r
1458                                 // 小節番号を-1する。\r
1459 \r
1460                                 this.mgr譜面管理者.dic小節.Remove( i );          // 小節番号は Dictionary のキー値であるため、番号が変われば再登録が必要。\r
1461                                 cずらす小節.n小節番号0to3599--;\r
1462                                 this.mgr譜面管理者.dic小節.Add( cずらす小節.n小節番号0to3599, cずらす小節 );\r
1463                         }\r
1464 \r
1465                         // 譜面内の小節が全部無くなったらさすがにまずいので、最低1個の小節は残す。\r
1466 \r
1467                         if( this.mgr譜面管理者.dic小節.Count == 0 )\r
1468                                 this.mgr譜面管理者.dic小節.Add( 0, new C小節( 0 ) );\r
1469 \r
1470                         //-----------------\r
1471                         #endregion\r
1472 \r
1473 \r
1474                         // 作業記録終了。\r
1475 \r
1476                         this.mgrUndoRedo管理者.tトランザクション記録を終了する();\r
1477 \r
1478         \r
1479                         // 後処理。\r
1480 \r
1481                         this.tUndoRedo用GUIの有効無効を設定する();\r
1482                         this.pictureBox譜面パネル.Refresh();\r
1483                         this.b未保存 = true;\r
1484                 }\r
1485                 //-----------------\r
1486                 #endregion\r
1487                 #region [ 選択チップの切り取り/コピー/貼り付け/削除 ]\r
1488                 //-----------------\r
1489                 private void tシナリオ_切り取り()\r
1490                 {\r
1491                         // 事前チェック。\r
1492 \r
1493                         #region [ 譜面にフォーカスが来てないなら何もしない。 ]\r
1494                         //-----------------\r
1495                         if( !this.pictureBox譜面パネル.Focused )\r
1496                                 return;\r
1497                         //-----------------\r
1498                         #endregion\r
1499 \r
1500 \r
1501                         // 切り取り。\r
1502 \r
1503                         #region [ 切り取り = コピー + 削除 ]\r
1504                         //-----------------\r
1505                         this.tシナリオ_コピー();\r
1506                         this.tシナリオ_削除();\r
1507                         //-----------------\r
1508                         #endregion\r
1509                 }\r
1510                 private void tシナリオ_コピー()\r
1511                 {\r
1512                         // 事前チェック。\r
1513 \r
1514                         #region [ 譜面にフォーカスが来てないなら何もしない。 ]\r
1515                         //-----------------\r
1516                         if( !this.pictureBox譜面パネル.Focused )\r
1517                                 return;\r
1518                         //-----------------\r
1519                         #endregion\r
1520 \r
1521 \r
1522                         // コピー。\r
1523 \r
1524                         this.cbクリップボード.t現在選択されているチップをボードにコピーする();\r
1525 \r
1526 \r
1527                         // 画面を再描画。\r
1528 \r
1529                         #region [ 画面を再描画する。]\r
1530                         //-----------------\r
1531                         this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();\r
1532                         this.pictureBox譜面パネル.Refresh();\r
1533                         //-----------------\r
1534                         #endregion\r
1535                 }\r
1536                 private void tシナリオ_貼り付け( int n譜面先頭からの位置grid )\r
1537                 {\r
1538                         // 事前チェック。\r
1539 \r
1540                         #region [ 譜面にフォーカスが来てないなら何もしない。 ]\r
1541                         //-----------------\r
1542                         if( !this.pictureBox譜面パネル.Focused )\r
1543                                 return;\r
1544                         //-----------------\r
1545                         #endregion\r
1546 \r
1547 \r
1548                         // 貼り付け。\r
1549 \r
1550                         #region [ 貼り付け先の小節と貼り付け開始位置を取得する。]\r
1551                         //-----------------\r
1552                         C小節 c小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
1553                         if( c小節 == null )\r
1554                                 return; // 中断\r
1555 \r
1556                         int n小節先頭からの位置grid =\r
1557                                 n譜面先頭からの位置grid - this.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( c小節.n小節番号0to3599 );\r
1558                         //-----------------\r
1559                         #endregion\r
1560                         \r
1561                         #region [ クリップボードからチップを貼り付ける。]\r
1562                         //-----------------\r
1563                         this.cbクリップボード.tチップを指定位置から貼り付ける( c小節, n小節先頭からの位置grid );\r
1564                         //-----------------\r
1565                         #endregion\r
1566 \r
1567 \r
1568                         // 画面の再描画。\r
1569 \r
1570                         #region [ 画面を再描画する。]\r
1571                         //-----------------\r
1572                         this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();\r
1573                         this.pictureBox譜面パネル.Refresh();\r
1574                         //-----------------\r
1575                         #endregion\r
1576                 }\r
1577                 private void tシナリオ_削除()\r
1578                 {\r
1579                         // 事前チェック。\r
1580 \r
1581                         #region [ 譜面にフォーカスが来てないなら何もしない。 ]\r
1582                         //-----------------\r
1583                         if( !this.pictureBox譜面パネル.Focused )\r
1584                                 return;\r
1585                         //-----------------\r
1586                         #endregion\r
1587 \r
1588 \r
1589                         // 操作記録開始。\r
1590 \r
1591                         this.mgrUndoRedo管理者.tトランザクション記録を開始する();\r
1592 \r
1593 \r
1594                         // チップを削除。\r
1595 \r
1596                         #region [ 譜面が持つすべての小節について、選択されているチップがあれば削除する。]\r
1597                         //-----------------\r
1598                         foreach( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )\r
1599                         {\r
1600                                 C小節 c小節 = pair.Value;\r
1601 \r
1602                                 bool b削除されたチップがある = false;\r
1603                                 bool b削除完了 = false;\r
1604                                 int laneBEAT  = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );\r
1605                                 List<int> list削除処理済BEAT_index = new List<int>();\r
1606 \r
1607                                 while( !b削除完了 )\r
1608                                 {\r
1609                                         #region [ 小節の持つチップのうち、選択されているチップがあれば削除してループする。なくなったら抜ける。]\r
1610                                         //-----------------\r
1611                                         \r
1612                                         b削除完了 = true;\r
1613 \r
1614                                         // 小節が持つすべてのチップについて……\r
1615                                         foreach( Cチップ cチップ in c小節.listチップ )\r
1616                                         {\r
1617                                                 if( cチップ.b確定選択中 )\r
1618                                                 {\r
1619                                                         #region [ UndoRedo リストにこの操作(チップ削除)を記録する。]\r
1620                                                         //-----------------\r
1621                                                         var cc = new Cチップ();\r
1622                                                         cc.tコピーfrom( cチップ );\r
1623                                                         var redo = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cc );\r
1624 \r
1625                                                         this.mgrUndoRedo管理者.tノードを追加する(\r
1626                                                                 new CUndoRedoセル<Cチップ配置用UndoRedo>(\r
1627                                                                         null,\r
1628                                                                         new DGUndoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のUndo ),\r
1629                                                                         new DGRedoを実行する<Cチップ配置用UndoRedo>( this.mgr譜面管理者.tチップ削除のRedo ),\r
1630                                                                         redo, redo ) );\r
1631                                                         //-----------------\r
1632                                                         #endregion\r
1633 \r
1634 \r
1635                                                         #region [ チップオブジェクトを削除する。ただしBEATオブジェクトは削除禁止。表裏を反転するだけ。]\r
1636                                                         if ( cチップ.nレーン番号0to != laneBEAT )\r
1637                                                         {\r
1638                                                                 c小節.listチップ.Remove( cチップ );\r
1639 \r
1640                                                                 // フラグを設定してループする。(foreachのlistを更新しているため)\r
1641                                                                 b削除完了 = false;          // まだ終わらんよ\r
1642                                                                 b削除されたチップがある = true;\r
1643                                                                 break;\r
1644                                                         }\r
1645                                                         else\r
1646                                                         {\r
1647                                                                 int p = c小節.listチップ.IndexOf( cチップ );\r
1648                                                                 if ( !list削除処理済BEAT_index.Contains( p ) )     // まだ裏表反転したことがないチップならば\r
1649                                                                 {\r
1650                                                                         cチップ.nチャンネル番号00toFF = ( cチップ.b裏 ) ? 0xF3 : 0xF8;            // 表裏反転\r
1651                                                                         cチップ.b裏 = !cチップ.b裏;\r
1652                                                                         c小節.listチップ[ p ] = cチップ;\r
1653                                                                         list削除処理済BEAT_index.Add( p );\r
1654 \r
1655                                                                         // フラグを設定してループする。(foreachのlistを更新しているため)\r
1656                                                                         b削除完了 = false;          // まだ終わらんよ\r
1657                                                                         b削除されたチップがある = true;\r
1658                                                                         break;\r
1659                                                                 }\r
1660                                                         }\r
1661                                                         #endregion\r
1662                                                 }\r
1663                                         }\r
1664                                         //-----------------\r
1665                                         #endregion\r
1666                                 }\r
1667                                 list削除処理済BEAT_index.Clear();\r
1668                                 list削除処理済BEAT_index = null;\r
1669 \r
1670                                 #region [ 1つでもチップを削除したなら、未保存フラグを立てる。 ]\r
1671                                 //-----------------\r
1672                                 if( b削除されたチップがある )\r
1673                                         this.b未保存 = true;\r
1674                                 //-----------------\r
1675                                 #endregion\r
1676                         }\r
1677                         //-----------------\r
1678                         #endregion\r
1679 \r
1680 \r
1681                         // 操作記録終了。\r
1682 \r
1683                         this.mgrUndoRedo管理者.tトランザクション記録を終了する();\r
1684 \r
1685 \r
1686                         // 画面を再描画する。\r
1687 \r
1688                         this.tUndoRedo用GUIの有効無効を設定する();\r
1689                         this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();\r
1690                         this.pictureBox譜面パネル.Refresh();\r
1691                 }\r
1692                 //-----------------\r
1693                 #endregion\r
1694                 #region [ DTXViewer での再生・停止 ]\r
1695                 //-----------------\r
1696                 private void tシナリオ_Viewerで最初から再生する()\r
1697                 {\r
1698                         #region [ DTXViewer 用の一時ファイルを出力する。]\r
1699                         //-----------------\r
1700                         this.tViewer用の一時ファイルを出力する( false, this.b未保存 | !this.b前回BGMありで再生した | this.b再生速度を変更した | this.bDTXファイルを開いた );\r
1701                         this.b前回BGMありで再生した = true;\r
1702                         //-----------------\r
1703                         #endregion\r
1704 \r
1705                         #region [ 再生開始オプション引数に一時ファイルを指定して DTXViewer プロセスを起動する。]\r
1706                         //-----------------\r
1707                         try\r
1708                         {\r
1709                                 string strDTXViewerのパス = this.strDTXCのあるフォルダ名 + this.appアプリ設定.ViewerInfo.Path;\r
1710 \r
1711                                 #region [ DTXViewer が起動していなければ起動する。]\r
1712                                 //-----------------\r
1713                                 // DTXManiaGR.exeはコンパクトモードで起動する必要があるため、「一旦起動してから再生オプションを渡す」やり方はやめる\r
1714                                 // Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 );        // 起動完了まで最大20秒待つ\r
1715                                 //-----------------\r
1716                                 #endregion\r
1717                                 \r
1718                                 #region [ 実行中の DTXViewer に再生オプションを渡す。 ]\r
1719                                 //-----------------\r
1720                                 Process.Start( strDTXViewerのパス,\r
1721                                         this.appアプリ設定.ViewerInfo.PlaySoundOption + this.appアプリ設定.ViewerInfo.PlayStartOption + " " + this.strViewer演奏用一時ファイル名 ).WaitForInputIdle( 20 * 1000 );\r
1722                                 //-----------------\r
1723                                 #endregion\r
1724                         }\r
1725                         catch( Exception )\r
1726                         {\r
1727                                 #region [ 失敗ダイアログを表示する。]\r
1728                                 //-----------------\r
1729                                 MessageBox.Show(\r
1730                                         Resources.strプロセスの起動に失敗しましたMSG,\r
1731                                         Resources.strエラーダイアログのタイトル,\r
1732                                         MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
1733                                 //-----------------\r
1734                                 #endregion\r
1735                         }\r
1736                         //-----------------\r
1737                         #endregion\r
1738                 }\r
1739                 private void tシナリオ_Viewerで現在位置から再生する()\r
1740                 {\r
1741                         #region [ DTXViewer 用の一時ファイルを出力する。]\r
1742                         //-----------------\r
1743                         this.tViewer用の一時ファイルを出力する( false, this.b未保存 | !this.b前回BGMありで再生した | this.b再生速度を変更した | this.bDTXファイルを開いた );\r
1744                         this.b前回BGMありで再生した = true;\r
1745                         //-----------------\r
1746                         #endregion\r
1747 \r
1748                         try\r
1749                         {\r
1750                                 string strDTXViewerのパス = this.strDTXCのあるフォルダ名 + this.appアプリ設定.ViewerInfo.Path;\r
1751 \r
1752                                 #region [ DTXViewer が起動していなければ起動する。]\r
1753                                 //-----------------\r
1754                                 // DTXManiaGR.exeはコンパクトモードで起動する必要があるため、「一旦起動してから再生オプションを渡す」やり方はやめる\r
1755                                 // Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 );        // 起動完了まで最大20秒待つ\r
1756                                 //-----------------\r
1757                                 #endregion\r
1758 \r
1759                                 #region [ 実行中の DTXViewer に再生オプションを渡す。 ]\r
1760                                 //-----------------\r
1761                                 \r
1762                                 C小節 c小節 =\r
1763                                         this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );\r
1764                                 \r
1765                                 Process.Start( strDTXViewerのパス,\r
1766                                         this.appアプリ設定.ViewerInfo.PlaySoundOption + this.appアプリ設定.ViewerInfo.PlayStartFromOption + c小節.n小節番号0to3599 + " " + this.strViewer演奏用一時ファイル名 ).WaitForInputIdle( 20 * 1000 );\r
1767                                 \r
1768                                 //-----------------\r
1769                                 #endregion\r
1770                         }\r
1771                         catch( Exception )\r
1772                         {\r
1773                                 #region [ 失敗ダイアログを表示する。]\r
1774                                 //-----------------\r
1775                                 MessageBox.Show(\r
1776                                         Resources.strプロセスの起動に失敗しましたMSG,\r
1777                                         Resources.strエラーダイアログのタイトル, \r
1778                                         MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
1779                                 //-----------------\r
1780                                 #endregion\r
1781                         }\r
1782                 }\r
1783                 private void tシナリオ_Viewerで現在位置からBGMのみ再生する()\r
1784                 {\r
1785                         #region [ DTXViewer 用の一時ファイルを出力する。]\r
1786                         //-----------------\r
1787                         this.tViewer用の一時ファイルを出力する( true, this.b未保存 | this.b前回BGMありで再生した | this.b再生速度を変更した | this.bDTXファイルを開いた );\r
1788                         this.b前回BGMありで再生した = false;\r
1789                         //-----------------\r
1790                         #endregion\r
1791 \r
1792                         try\r
1793                         {\r
1794                                 string strDTXViewerのパス = this.strDTXCのあるフォルダ名 + this.appアプリ設定.ViewerInfo.Path;\r
1795 \r
1796                                 #region [ DTXViewer が起動していなければ起動する。]\r
1797                                 //-----------------\r
1798                                 // DTXManiaGR.exeはコンパクトモードで起動する必要があるため、「一旦起動してから再生オプションを渡す」やり方はやめる\r
1799                                 // Process.Start( strDTXViewerのパス ).WaitForInputIdle( 20 * 1000 );        // 起動完了まで最大20秒待つ\r
1800                                 //-----------------\r
1801                                 #endregion\r
1802 \r
1803                                 #region [ 実行中の DTXViewer に再生オプションを渡す。 ]\r
1804                                 //-----------------\r
1805                                 C小節 c小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );\r
1806                                 Process.Start( strDTXViewerのパス,\r
1807                                         this.appアプリ設定.ViewerInfo.PlaySoundOption + this.appアプリ設定.ViewerInfo.PlayStartFromOption + c小節.n小節番号0to3599 + " " + this.strViewer演奏用一時ファイル名 ).WaitForInputIdle( 20 * 1000 );\r
1808                                 //-----------------\r
1809                                 #endregion\r
1810                         }\r
1811                         catch( Exception )\r
1812                         {\r
1813                                 #region [ 失敗ダイアログを表示する。]\r
1814                                 //-----------------\r
1815                                 MessageBox.Show(\r
1816                                         Resources.strプロセスの起動に失敗しましたMSG,\r
1817                                         Resources.strエラーダイアログのタイトル,\r
1818                                         MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
1819                                 //-----------------\r
1820                                 #endregion\r
1821                         }\r
1822                 }\r
1823                 private void tシナリオ_Viewerを再生停止する()\r
1824                 {\r
1825                         try\r
1826                         {\r
1827                                 string strViewerのパス = this.strDTXCのあるフォルダ名 + this.appアプリ設定.ViewerInfo.Path;\r
1828 \r
1829                                 #region [ 実行中の DTXViewer に再生停止オプションを渡す。 ]\r
1830                                 //-----------------\r
1831 \r
1832                                 // 停止のときは1回のプロセス起動で完結(BMSV仕様)\r
1833 \r
1834                                 Process.Start( strViewerのパス, this.appアプリ設定.ViewerInfo.PlayStopOption );\r
1835 \r
1836                                 //-----------------\r
1837                                 #endregion\r
1838 \r
1839                         }\r
1840                         catch( Exception )\r
1841                         {\r
1842                                 #region [ 失敗ダイアログを表示する。]\r
1843                                 //-----------------\r
1844                                 MessageBox.Show(\r
1845                                         Resources.strプロセスの起動に失敗しましたMSG,\r
1846                                         Resources.strエラーダイアログのタイトル,\r
1847                                         MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1 );\r
1848                                 //-----------------\r
1849                                 #endregion\r
1850                         }\r
1851                 }\r
1852 \r
1853                 private string strViewer演奏用一時ファイル名 = "";\r
1854                 private void tViewer用の一時ファイルを出力する( bool bBGMのみ出力, bool b前回から更新があった )\r
1855                 {\r
1856                         // 一時ファイル名を自動生成。\r
1857 \r
1858                         // 前回から更新がなければ(連続して再生ボタンを押した、など)、前回の生成ファイルをそのまま返す。\r
1859                         // (初めての再生の場合は、tempファイル未生成のため、このまま生成フローを続ける。)\r
1860                         if ( !b前回から更新があった && File.Exists( Path.Combine( this.mgr譜面管理者.strPATH_WAV, this.strViewer演奏用一時ファイル名 ) ) )\r
1861                         {\r
1862                                 return;\r
1863                         }\r
1864 \r
1865                         // 再生速度変更フラグをリセット。\r
1866                         b再生速度を変更した = false;\r
1867                         bDTXファイルを開いた = false;\r
1868 \r
1869                         //this.strViewer演奏用一時ファイル名 = Path.GetTempFileName();                        //\r
1870                         this.strViewer演奏用一時ファイル名 = makeTempDTX.GetTempFileName();           // #24746 2011.4.1 yyagi add; a countermeasure for temp-flooding\r
1871                         \r
1872                         // 一時ファイルにDTXを出力。\r
1873 \r
1874                         this.mgr譜面管理者.strPATH_WAV = this.str作業フォルダ名;\r
1875 \r
1876                         try\r
1877                         {\r
1878                                 #region [ もし小数点にコンマを使うcultureなら、一時的に(小数点を使う)"en-GB"に切り替える。(DTXVはピリオドしか使えないため) ]\r
1879                                 string currentCultureEnglishName = CultureInfo.CurrentCulture.Name;\r
1880                                 bool bSwitchCulture = false;\r
1881                                 if (CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator == ",")\r
1882                                 {\r
1883                                         Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB", false);  // #24241, #24790 2011.4.8 yyagi: switch culture where the country uses period as the decimal point\r
1884                                         bSwitchCulture = true;                                                                                                  // I mistook here using CurrentUICulture. Use CurrentCulture to work correctly.\r
1885                                 }\r
1886                                 #endregion\r
1887                                 #region [ 一時ファイルにDTXを出力する。 ]\r
1888                                 //-----------------\r
1889                                 StreamWriter sw = new StreamWriter( this.strViewer演奏用一時ファイル名, false, Encoding.GetEncoding( 0x3a4 ) );\r
1890                                 new CDTX入出力( this ).tDTX出力( sw, bBGMのみ出力 );\r
1891                                 sw.Close();\r
1892                                 //-----------------\r
1893                                 #endregion\r
1894                                 #region [ cultureを元に戻す。 ]\r
1895                                 if (bSwitchCulture)\r
1896                                 {\r
1897                                         Thread.CurrentThread.CurrentCulture = new CultureInfo(currentCultureEnglishName, false);\r
1898                                 }\r
1899                                 #endregion\r
1900                         }\r
1901                         finally\r
1902                         {\r
1903                                 this.mgr譜面管理者.strPATH_WAV = "";\r
1904                         }\r
1905                 }\r
1906                 private void tViewer用の一時ファイルを削除する()\r
1907                 {\r
1908                         this.strViewer演奏用一時ファイル名 = "";              // #35351 2015.7.23 yyagi add; to fix viewer plyback correctly just after save.\r
1909                 }\r
1910                 //-----------------\r
1911                 #endregion\r
1912                 #region [ Undo / Redo ]\r
1913                 //-----------------\r
1914                 private void tシナリオ_Undoする()\r
1915                 {\r
1916                         // Undo を実行する。\r
1917 \r
1918                         #region [ Undo する対象を Undo/Redo リストから取得する。]\r
1919                         //-----------------\r
1920         \r
1921                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す();\r
1922 \r
1923                         if( oセル仮想 == null )\r
1924                                 return;         // なければ中断\r
1925                         \r
1926                         //-----------------\r
1927                         #endregion\r
1928                         \r
1929                         oセル仮想.tUndoを実行する();\r
1930 \r
1931 \r
1932                         // GUIを再描画する。\r
1933 \r
1934                         #region [ GUI を再描画する。]\r
1935                         //-----------------\r
1936                         this.tUndoRedo用GUIの有効無効を設定する();\r
1937                         this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();\r
1938                         this.pictureBox譜面パネル.Refresh();\r
1939                         //-----------------\r
1940                         #endregion\r
1941                 }\r
1942                 private void tシナリオ_Redoする()\r
1943                 {\r
1944                         // Redo を実行する。\r
1945 \r
1946                         #region [ Redo する対象を Undo/Redo リストから取得する。]\r
1947                         //-----------------\r
1948 \r
1949                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tRedoするノードを取得して返す();\r
1950 \r
1951                         if( oセル仮想 == null )\r
1952                                 return; // なければ中断\r
1953 \r
1954                         //-----------------\r
1955                         #endregion\r
1956 \r
1957                         oセル仮想.tRedoを実行する();\r
1958 \r
1959 \r
1960                         // GUI を再描画する。\r
1961 \r
1962                         #region [ GUI を再描画する。]\r
1963                         //-----------------\r
1964                         this.tUndoRedo用GUIの有効無効を設定する();\r
1965                         this.t選択チップの有無に応じて編集用GUIの有効無効を設定する();\r
1966                         this.pictureBox譜面パネル.Refresh();\r
1967                         //-----------------\r
1968                         #endregion\r
1969                 }\r
1970                 //-----------------\r
1971                 #endregion\r
1972 \r
1973 \r
1974                 // メソッド\r
1975 \r
1976                 public enum Eタブ種別 : int\r
1977                 {\r
1978                         基本情報 = 0,\r
1979                         WAV = 1,\r
1980                         BMP = 2,\r
1981                         AVI = 3,\r
1982                         自由入力 = 4\r
1983                 }\r
1984 \r
1985                 public void t選択モードにする()\r
1986                 {\r
1987                         this.toolStripButton選択モード.CheckState = CheckState.Checked;\r
1988                         this.toolStripButton編集モード.CheckState = CheckState.Unchecked;\r
1989                         this.toolStripMenuItem選択モード.CheckState = CheckState.Checked;\r
1990                         this.toolStripMenuItem編集モード.CheckState = CheckState.Unchecked;\r
1991                 }\r
1992                 public void t編集モードにする()\r
1993                 {\r
1994                         this.mgr選択モード管理者.t全チップの選択を解除する();\r
1995                         this.pictureBox譜面パネル.Refresh();\r
1996                         this.toolStripButton選択モード.CheckState = CheckState.Unchecked;\r
1997                         this.toolStripButton編集モード.CheckState = CheckState.Checked;\r
1998                         this.toolStripMenuItem選択モード.CheckState = CheckState.Unchecked;\r
1999                         this.toolStripMenuItem編集モード.CheckState = CheckState.Checked;\r
2000                 }\r
2001                 public void t選択チップの有無に応じて編集用GUIの有効無効を設定する()\r
2002                 {\r
2003                         bool b譜面上に選択チップがある = this.b選択チップがある;\r
2004                         bool bクリップボードに選択チップがある = ( this.cbクリップボード != null ) && ( this.cbクリップボード.nセル数 > 0 );\r
2005 \r
2006 \r
2007                         // 編集メニュー\r
2008 \r
2009                         this.toolStripMenuItemコピー.Enabled = b譜面上に選択チップがある;\r
2010                         this.toolStripMenuItem切り取り.Enabled = b譜面上に選択チップがある;\r
2011                         this.toolStripMenuItem貼り付け.Enabled = bクリップボードに選択チップがある;\r
2012                         this.toolStripMenuItem削除.Enabled = b譜面上に選択チップがある;\r
2013 \r
2014 \r
2015                         // ツールバー\r
2016 \r
2017                         this.toolStripButtonコピー.Enabled = b譜面上に選択チップがある;\r
2018                         this.toolStripButton切り取り.Enabled = b譜面上に選択チップがある;\r
2019                         this.toolStripButton貼り付け.Enabled = bクリップボードに選択チップがある;\r
2020                         this.toolStripButton削除.Enabled = b譜面上に選択チップがある;\r
2021 \r
2022         \r
2023                         // 右メニュー\r
2024 \r
2025                         this.toolStripMenuItem選択チップのコピー.Enabled = b譜面上に選択チップがある;\r
2026                         this.toolStripMenuItem選択チップの切り取り.Enabled = b譜面上に選択チップがある;\r
2027                         this.toolStripMenuItem選択チップの貼り付け.Enabled = bクリップボードに選択チップがある;\r
2028                         this.toolStripMenuItem選択チップの削除.Enabled = b譜面上に選択チップがある;\r
2029                 }\r
2030                 public void t選択モードのコンテクストメニューを表示する( int x, int y )\r
2031                 {\r
2032                         // メニューの左上隅座標を控えておく。\r
2033 \r
2034                         this.pt選択モードのコンテクストメニューを開いたときのマウスの位置 = new Point( x, y );\r
2035                         \r
2036                         #region [ クリックされた箇所のレーン番号を取得する。]\r
2037                         //-----------------\r
2038                         int lane = this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( pt選択モードのコンテクストメニューを開いたときのマウスの位置.X );\r
2039                         string strLane = (lane < 0)? "" : this.mgr譜面管理者.listレーン[ lane ].strレーン名;\r
2040                         //-----------------\r
2041                         #endregion\r
2042 \r
2043                         #region [ クリックされた箇所の小節番号を取得する。]\r
2044                         //-----------------\r
2045                         int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( pt選択モードのコンテクストメニューを開いたときのマウスの位置.Y );\r
2046                         C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
2047                         if ( csクリックされた小節 == null ) return;            // 小節が生成されていないところで右クリックした場合は何もしない(NullReferenceException回避)\r
2048                         int nPartNo = csクリックされた小節.n小節番号0to3599;\r
2049                         string strPartNo = C変換.str小節番号を文字列3桁に変換して返す( nPartNo );\r
2050                         //-----------------\r
2051                         #endregion\r
2052 \r
2053                         #region [ コンテクストメニューの[選択]項目に、レーン名と小節番号の情報をを付与する。 ]\r
2054                         int indexMenuLaneSelect1 = this.contextMenuStrip譜面右メニュー.Items.IndexOfKey( "toolStripMenuItemレーン内のすべてのチップの選択1" );\r
2055                         int indexMenuLaneSelect2 = this.contextMenuStrip譜面右メニュー.Items.IndexOfKey( "toolStripMenuItemレーン内のすべてのチップの選択_特定小節以降2" );\r
2056                         int indexMenuPartSelect = this.contextMenuStrip譜面右メニュー.Items.IndexOfKey( "toolStripMenuItem小節内のすべてのチップの選択" );\r
2057 \r
2058                         string strItemMenuLaneSelect = this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect1 ].Text;\r
2059                         strItemMenuLaneSelect = System.Text.RegularExpressions.Regex.Replace(\r
2060                                 strItemMenuLaneSelect , @"\[(.*)\]", "[" + strLane + "]" );\r
2061                         this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect1 ].Text = strItemMenuLaneSelect;\r
2062 \r
2063                         strItemMenuLaneSelect = this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect2 ].Text;\r
2064                         strItemMenuLaneSelect = System.Text.RegularExpressions.Regex.Replace(\r
2065                                 strItemMenuLaneSelect, @"\[(.*)\]", "[" + strLane + "]" );\r
2066                         this.contextMenuStrip譜面右メニュー.Items[ indexMenuLaneSelect2 ].Text = strItemMenuLaneSelect;\r
2067 \r
2068                         string strItemMenuPartSelect = this.contextMenuStrip譜面右メニュー.Items[ indexMenuPartSelect ].Text;\r
2069                         strItemMenuPartSelect = System.Text.RegularExpressions.Regex.Replace(\r
2070                                 strItemMenuPartSelect, @"\[(.*)\]", "[" + strPartNo + "]" );\r
2071                         this.contextMenuStrip譜面右メニュー.Items[ indexMenuPartSelect ].Text = strItemMenuPartSelect;\r
2072                         #endregion\r
2073 \r
2074                         // メニューを表示。\r
2075 \r
2076                         this.contextMenuStrip譜面右メニュー.Show( this.pictureBox譜面パネル, x, y );\r
2077                 }\r
2078                 public void t最近使ったファイルをFileメニューへ追加する()\r
2079                 {\r
2080                         #region [ [ファイル] メニューから、最近使ったファイルの一覧をクリアする。]\r
2081                         //-----------------\r
2082                         for( int i = 0; i < this.toolStripMenuItemファイル.DropDownItems.Count; i++ )\r
2083                         {\r
2084                                 ToolStripItem item = this.toolStripMenuItemファイル.DropDownItems[ i ];\r
2085 \r
2086                                 // ↓削除したくないサブメニューの一覧。これ以外のサブメニュー項目はすべて削除する。\r
2087                                 if( item != this.toolStripMenuItem新規 &&\r
2088                                         item != this.toolStripMenuItem開く &&\r
2089                                         item != this.toolStripMenuItem上書き保存 &&\r
2090                                         item != this.toolStripMenuItem名前を付けて保存 &&\r
2091                                         item != this.toolStripSeparator1 &&\r
2092                                         item != this.toolStripMenuItem終了 )\r
2093                                 {\r
2094                                         this.toolStripMenuItemファイル.DropDownItems.Remove( item );\r
2095                                         i = -1; // 要素数が変わったので列挙しなおし\r
2096                                 }\r
2097                         }\r
2098                         //-----------------\r
2099                         #endregion\r
2100 \r
2101                         #region [ 表示しないオプション設定であるか、履歴が0件ならここで終了する。]\r
2102                         //-----------------\r
2103                         if( !this.appアプリ設定.ShowRecentFiles || this.appアプリ設定.RecentUsedFile.Count == 0 )\r
2104                                 return;\r
2105                         //-----------------\r
2106                         #endregion\r
2107 \r
2108                         #region [ アプリ設定が持つ履歴にそって、[ファイル] メニューにサブメニュー項目リストを追加する(ただし最大表示数まで)。 ]\r
2109                         //-----------------\r
2110 \r
2111                         // [ファイル] のサブメニューリストに項目が1つでもある場合は、履歴サブメニュー項目の追加の前に「終了」の下にセパレータを入れる。手動で。\r
2112 \r
2113                         bool bセパレータの追加がまだ = true;\r
2114 \r
2115 \r
2116                         // すべての「最近使ったファイル」について...\r
2117 \r
2118                         for( int i = 0; i < this.appアプリ設定.RecentUsedFile.Count; i++ )\r
2119                         {\r
2120                                 #region [ 最大表示数を越えたらここで終了。 ]\r
2121                                 //-----------------\r
2122                                 if( i >= this.appアプリ設定.RecentFilesNum )\r
2123                                         return;\r
2124                                 //-----------------\r
2125                                 #endregion\r
2126 \r
2127                                 #region [ ファイル名を、サブメニュー項目として [ファイル] メニューに追加する。 ]\r
2128                                 //-----------------\r
2129                                 string path = this.appアプリ設定.RecentUsedFile[ i ];\r
2130 \r
2131                                 if( path.Length == 0 )\r
2132                                         continue;\r
2133 \r
2134                                 #region [ セパレータの追加がまだなら追加する。]\r
2135                                 //-----------------\r
2136                                 if( bセパレータの追加がまだ )\r
2137                                 {\r
2138                                         var separator = new ToolStripSeparator();\r
2139                                         separator.Size = this.toolStripSeparator1.Size;\r
2140                                         this.toolStripMenuItemファイル.DropDownItems.Add( separator );\r
2141                                         bセパレータの追加がまだ = false;\r
2142                                 }\r
2143                                 //-----------------\r
2144                                 #endregion\r
2145 \r
2146                                 #region [ ToolStripMenuItem を手動で作って [ファイル] のサブメニューリストに追加する。]\r
2147                                 //-----------------\r
2148                                 string strShotenPath = AdjustPathString( path );        // #35890 2016.1.3 yyagi; shorten "RecentFiles" text if needed\r
2149                                 var item2 = new ToolStripMenuItem() {\r
2150                                         Name = "最近使ったファイル" + i,\r
2151                                         Size = this.toolStripMenuItem終了.Size,\r
2152                                         Text = "&" + i + " " + strShotenPath,\r
2153                                         ToolTipText = path,\r
2154                                 };\r
2155                                 item2.Click += new EventHandler( this.toolStripMenuItem最近使ったファイル_Click );\r
2156                                 this.toolStripMenuItemファイル.DropDownItems.Add( item2 );\r
2157                                 //-----------------\r
2158                                 #endregion\r
2159 \r
2160                                 #region [ 追加したファイルが既に存在していないなら項目を無効化(グレー表示)する。]\r
2161                                 //-----------------\r
2162                                 if( !File.Exists( path ) )\r
2163                                         item2.Enabled = false;\r
2164                                 //-----------------\r
2165                                 #endregion\r
2166 \r
2167                                 //-----------------\r
2168                                 #endregion\r
2169                         }\r
2170                         //-----------------\r
2171                         #endregion\r
2172                 }\r
2173                 // 参考: http://gushwell.ldblog.jp/archives/50815731.html\r
2174                 private string AdjustPathString( string text )\r
2175                 {\r
2176                         int nTargetWidth = (int)(this.Width * 0.8f);\r
2177                         Bitmap bmp = new Bitmap(nTargetWidth, this.Height);\r
2178                         Graphics g = Graphics.FromImage( bmp );\r
2179                         var item = new ToolStripMenuItem();\r
2180                         SizeF size = g.MeasureString( text, item.Font );\r
2181 //Debug.WriteLine( "WinWidth"+ this.Width + ", now=" + size.Width + ", font=" + this.Font.ToString());\r
2182                         while ( nTargetWidth < size.Width )\r
2183                         {\r
2184                                 string text2 = ShortenPathString( text );\r
2185                                 if ( text == text2 )\r
2186                                         break;\r
2187                                 size = g.MeasureString( text2, this.Font );\r
2188                                 text = text2;\r
2189 //Debug.WriteLine( "winWidth" + this.Width + ", now=" + size.Width + ", font=" + this.Font.ToString() );\r
2190                         }\r
2191                         item.Dispose();\r
2192                         g.Dispose();\r
2193                         bmp.Dispose();\r
2194                         return text;\r
2195                 }\r
2196                 private string ShortenPathString( string text )\r
2197                 {\r
2198                         int nWidth = this.Width;\r
2199                         List<string> list = new List<string>(text.Split('\\'));\r
2200                         int i = list.Count / 2;\r
2201                 if ( list[i] != "..." )\r
2202                         {\r
2203                             list[i] = "...";\r
2204                 }\r
2205                         else\r
2206                         {\r
2207                     if ( list.Count % 2 == 0 && i > 1 )\r
2208                             list.RemoveAt(i - 1);\r
2209                             else if ( list.Count % 2 == 1 && i < list.Count - 2 )\r
2210                                     list.RemoveAt(i + 1);\r
2211                 }\r
2212                 StringBuilder sb = new StringBuilder(list[0]);\r
2213                     for ( int n = 1; n < list.Count; n++ ) {\r
2214                             sb.Append('\\').Append(list[n]);\r
2215                 }\r
2216 //Debug.WriteLine( "org:" + text );\r
2217 //Debug.WriteLine( "now:" + sb );\r
2218                         return sb.ToString();\r
2219             }\r
2220                 public void tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( int nIndex番号0to1294 )\r
2221                 {\r
2222                         if( nIndex番号0to1294 >= 0 && nIndex番号0to1294 <= 1294 )\r
2223                         {\r
2224                                 this.mgrWAVリスト管理者.tItemを選択する( nIndex番号0to1294 );\r
2225                                 this.mgrBMPリスト管理者.tItemを選択する( nIndex番号0to1294 );\r
2226                                 this.mgrAVIリスト管理者.tItemを選択する( nIndex番号0to1294 );\r
2227 \r
2228                                 this.n現在選択中のWAV_BMP_AVIリストの行番号0to1294 = nIndex番号0to1294;\r
2229                         }\r
2230                 }\r
2231                 public string strファイルの存在するディレクトリを絶対パスで返す( string strファイル )\r
2232                 {\r
2233                         string strファイルの絶対パス = strファイル;\r
2234 \r
2235                         try\r
2236                         {\r
2237                                 // ファイルが絶対パスかどうかを判定する。(new Uri() は相対パスを指定されると例外が発生するので、それを利用する。)\r
2238 \r
2239                                 new Uri( strファイル );\r
2240                         }\r
2241                         catch\r
2242                         {\r
2243                                 // 例外が発生したので相対パスとみなし、絶対パスに直す。\r
2244 \r
2245                                 strファイルの絶対パス = this.str作業フォルダ名 + strファイル;\r
2246                         }\r
2247 \r
2248                         // 正規化する。(\a\b\c\..\d を \a\b\d にする)\r
2249 \r
2250 //                      FileInfo fi = new FileInfo( strファイルの絶対パス );\r
2251 //\                     strファイルの絶対パス = fi.FullName;\r
2252 \r
2253                         return strファイルの絶対パス;\r
2254                 }\r
2255                 public Point pt現在のマウス位置を譜面の可視領域相対の座標dotで返す()\r
2256                 {\r
2257                         Point p = new Point( Cursor.Position.X, Cursor.Position.Y );\r
2258                         return this.splitContainerタブと譜面を分割.Panel2.PointToClient( p );\r
2259                 }\r
2260                 public Size sz譜面の可視領域の大きさdotを返す()\r
2261                 {\r
2262                         return new Size( this.splitContainerタブと譜面を分割.Panel2.Width, this.pictureBox譜面パネル.Height );\r
2263                 }\r
2264                 public void tUndoRedo用GUIの有効無効を設定する()\r
2265                 {\r
2266                         this.toolStripMenuItemアンドゥ.Enabled = this.mgrUndoRedo管理者.nUndo可能な回数 > 0;\r
2267                         this.toolStripMenuItemリドゥ.Enabled = this.mgrUndoRedo管理者.nRedo可能な回数 > 0;\r
2268                         this.toolStripButtonアンドゥ.Enabled = this.mgrUndoRedo管理者.nUndo可能な回数 > 0;\r
2269                         this.toolStripButtonリドゥ.Enabled = this.mgrUndoRedo管理者.nRedo可能な回数 > 0;\r
2270                 }\r
2271                 public void tタブを選択する( Eタブ種別 eタブ種別 )\r
2272                 {\r
2273                         this.tabControl情報パネル.SelectedIndex = (int) eタブ種別;\r
2274                 }\r
2275 \r
2276 \r
2277                 // その他\r
2278 \r
2279                 #region [ private ]\r
2280                 //-----------------\r
2281                 private bool _b未保存 = true;\r
2282                 private bool b前回BGMありで再生した = true;\r
2283                 private bool b再生速度を変更した = false;\r
2284                 private bool bDTXファイルを開いた = false;\r
2285                 private Point pt選択モードのコンテクストメニューを開いたときのマウスの位置;\r
2286                 private int n現在のガイド間隔4to64or0 = 16;             // 初期は16分間隔\r
2287                 private bool b選択チップがある\r
2288                 {\r
2289                         get\r
2290                         {\r
2291                                 foreach( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )\r
2292                                 {\r
2293                                         foreach( Cチップ cチップ in pair.Value.listチップ )\r
2294                                         {\r
2295                                                 if( cチップ.b確定選択中 )\r
2296                                                         return true;\r
2297                                         }\r
2298                                 }\r
2299                                 return false;\r
2300                         }\r
2301                 }\r
2302 \r
2303                 public void tDTXV演奏関連のボタンとメニューのEnabledの設定()\r
2304                 {\r
2305                         if( File.Exists( this.strDTXCのあるフォルダ名 + this.appアプリ設定.ViewerInfo.Path ) )\r
2306                         {\r
2307                                 // DTXViewer(DTXManiaGR) が存在するなら Enable\r
2308 \r
2309                                 this.toolStripButton先頭から再生.Enabled = true;\r
2310                                 this.toolStripButton現在位置から再生.Enabled = true;\r
2311                                 this.toolStripButton現在位置からBGMのみ再生.Enabled = true;\r
2312                                 this.toolStripButton再生停止.Enabled = true;\r
2313                                 this.toolStripMenuItem先頭から再生.Enabled = true;\r
2314                                 this.toolStripMenuItem現在位置から再生.Enabled = true;\r
2315                                 this.toolStripMenuItem現在位置からBGMのみ再生.Enabled = true;\r
2316                                 this.toolStripMenuItem再生停止.Enabled = true;\r
2317                         }\r
2318                         else\r
2319                         {\r
2320                                 // DTXViewer(DTXManiaGR) が存在しないなら Disable\r
2321 \r
2322                                 this.toolStripButton先頭から再生.Enabled = false;\r
2323                                 this.toolStripButton現在位置から再生.Enabled = false;\r
2324                                 this.toolStripButton現在位置からBGMのみ再生.Enabled = false;\r
2325                                 this.toolStripButton再生停止.Enabled = false;\r
2326                                 this.toolStripMenuItem先頭から再生.Enabled = false;\r
2327                                 this.toolStripMenuItem現在位置から再生.Enabled = false;\r
2328                                 this.toolStripMenuItem現在位置からBGMのみ再生.Enabled = false;\r
2329                                 this.toolStripMenuItem再生停止.Enabled = false;\r
2330                         }\r
2331                 }\r
2332                 private string tファイル選択ダイアログでファイルを選択し相対パスにして返す( string strタイトル, string strフィルタ, string str初期フォルダ )\r
2333                 {\r
2334                         string str相対ファイル名 = "";\r
2335 \r
2336                         this.dlgチップパレット.t一時的に隠蔽する();\r
2337 \r
2338                         var dialog = new OpenFileDialog() {\r
2339                                 Title = strタイトル,\r
2340                                 Filter = strフィルタ,\r
2341                                 FilterIndex = 1,\r
2342                                 InitialDirectory = str初期フォルダ,\r
2343                         };\r
2344                         if( dialog.ShowDialog() == DialogResult.OK )\r
2345                         {\r
2346                                 str相対ファイル名 = Cファイル選択_パス変換.str基点からの相対パスに変換して返す( dialog.FileName, this.str作業フォルダ名 );\r
2347                                 str相対ファイル名.Replace( '/', '\\' );\r
2348                         }\r
2349                         else\r
2350                                 str相対ファイル名 = "";\r
2351 \r
2352                         this.dlgチップパレット.t一時的な隠蔽を解除する();\r
2353 \r
2354                         return str相対ファイル名;\r
2355                 }\r
2356                 public DialogResult t未保存なら保存する()\r
2357                 {\r
2358                         var result = DialogResult.OK;\r
2359 \r
2360                         if( this.b未保存 )\r
2361                         {\r
2362                                 // ダイアログで保存可否を確認。\r
2363 \r
2364                                 this.dlgチップパレット.t一時的に隠蔽する();\r
2365                                 result = MessageBox.Show( Resources.str編集中のデータを保存しますかMSG, Resources.str確認ダイアログのタイトル, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1 );\r
2366                                 this.dlgチップパレット.t一時的な隠蔽を解除する();\r
2367                                 \r
2368 \r
2369                                 // YES なら上書き保存。\r
2370 \r
2371                                 if( result == DialogResult.Yes )\r
2372                                         this.tシナリオ_上書き保存();\r
2373 \r
2374 \r
2375                                 // 画面を再描画。\r
2376 \r
2377                                 this.Refresh();\r
2378                         }\r
2379                         return result;\r
2380                 }\r
2381                 private void t次のプロパティ変更処理がUndoRedoリストに載らないようにする()\r
2382                 {\r
2383                         CUndoRedo管理.bUndoRedoした直後 = true;\r
2384                 }\r
2385                 private void t次のプロパティ変更処理がUndoRedoリストに載るようにする()\r
2386                 {\r
2387                         CUndoRedo管理.bUndoRedoした直後 = false;\r
2388                 }\r
2389 \r
2390                 /// <summary>\r
2391                 /// <para>n分 … 4分間隔なら 4、8分間隔なら 8 など、フリー間隔なら 0 を指定する。</para>\r
2392                 /// </summary>\r
2393                 private void tガイド間隔を変更する( int n分 )\r
2394                 {\r
2395                         // 新しいガイド間隔を設定。\r
2396 \r
2397                         #region [ 新しいガイド間隔を設定。 ]\r
2398                         //-----------------\r
2399                         \r
2400                         this.n現在のガイド間隔4to64or0 = n分;\r
2401 \r
2402                         this.mgr譜面管理者.n現在のガイド幅grid =\r
2403                                 ( n分 == 0 ) ? 1 : ( C小節.n基準の高さgrid / n分 );\r
2404                         \r
2405                         //-----------------\r
2406                         #endregion\r
2407 \r
2408 \r
2409                         // ガイド間隔メニュー GUI を更新。\r
2410 \r
2411                         #region [ 一度すべてのガイド間隔メニューのチェックをはずし、制定された分数のメニューのみチェックする。 ]\r
2412                         //-----------------\r
2413                         this.toolStripMenuItemガイド間隔4分.CheckState = CheckState.Unchecked;\r
2414                         this.toolStripMenuItemガイド間隔8分.CheckState = CheckState.Unchecked;\r
2415                         this.toolStripMenuItemガイド間隔12分.CheckState = CheckState.Unchecked;\r
2416                         this.toolStripMenuItemガイド間隔16分.CheckState = CheckState.Unchecked;\r
2417                         this.toolStripMenuItemガイド間隔24分.CheckState = CheckState.Unchecked;\r
2418                         this.toolStripMenuItemガイド間隔32分.CheckState = CheckState.Unchecked;\r
2419                         this.toolStripMenuItemガイド間隔48分.CheckState = CheckState.Unchecked;\r
2420                         this.toolStripMenuItemガイド間隔64分.CheckState = CheckState.Unchecked;\r
2421                         this.toolStripMenuItemガイド間隔フリー.CheckState = CheckState.Unchecked;\r
2422                         \r
2423                         switch( n分 )\r
2424                         {\r
2425                                 case 8:\r
2426                                         this.toolStripMenuItemガイド間隔8分.CheckState = CheckState.Checked;\r
2427                                         this.toolStripComboBoxガイド間隔.SelectedIndex = 1;\r
2428                                         break;\r
2429 \r
2430                                 case 12:\r
2431                                         this.toolStripMenuItemガイド間隔12分.CheckState = CheckState.Checked;\r
2432                                         this.toolStripComboBoxガイド間隔.SelectedIndex = 2;\r
2433                                         break;\r
2434 \r
2435                                 case 0:\r
2436                                         this.toolStripMenuItemガイド間隔フリー.CheckState = CheckState.Checked;\r
2437                                         this.toolStripComboBoxガイド間隔.SelectedIndex = 8;\r
2438                                         break;\r
2439 \r
2440                                 case 4:\r
2441                                         this.toolStripMenuItemガイド間隔4分.CheckState = CheckState.Checked;\r
2442                                         this.toolStripComboBoxガイド間隔.SelectedIndex = 0;\r
2443                                         break;\r
2444 \r
2445                                 case 0x10:\r
2446                                         this.toolStripMenuItemガイド間隔16分.CheckState = CheckState.Checked;\r
2447                                         this.toolStripComboBoxガイド間隔.SelectedIndex = 3;\r
2448                                         break;\r
2449 \r
2450                                 case 0x18:\r
2451                                         this.toolStripMenuItemガイド間隔24分.CheckState = CheckState.Checked;\r
2452                                         this.toolStripComboBoxガイド間隔.SelectedIndex = 4;\r
2453                                         break;\r
2454 \r
2455                                 case 0x20:\r
2456                                         this.toolStripMenuItemガイド間隔32分.CheckState = CheckState.Checked;\r
2457                                         this.toolStripComboBoxガイド間隔.SelectedIndex = 5;\r
2458                                         break;\r
2459 \r
2460                                 case 0x30:\r
2461                                         this.toolStripMenuItemガイド間隔48分.CheckState = CheckState.Checked;\r
2462                                         this.toolStripComboBoxガイド間隔.SelectedIndex = 6;\r
2463                                         break;\r
2464 \r
2465                                 case 0x40:\r
2466                                         this.toolStripMenuItemガイド間隔64分.CheckState = CheckState.Checked;\r
2467                                         this.toolStripComboBoxガイド間隔.SelectedIndex = 7;\r
2468                                         break;\r
2469                         }\r
2470                         //-----------------\r
2471                         #endregion\r
2472 \r
2473 \r
2474                         // 画面を再描画。\r
2475 \r
2476                         #region [ 画面を再描画する。]\r
2477                         //-----------------\r
2478                         this.pictureBox譜面パネル.Invalidate();\r
2479                         //-----------------\r
2480                         #endregion\r
2481                 }\r
2482 \r
2483 \r
2484                 // GUI イベント\r
2485 \r
2486                 #region [ GUIイベント:メインフォーム ]\r
2487                 //-----------------\r
2488                 private void Cメインフォーム_DragDrop( object sender, DragEventArgs e )\r
2489                 {\r
2490                         string[] data = (string[]) e.Data.GetData( DataFormats.FileDrop );\r
2491                         if( data.Length >= 1 )\r
2492                         {\r
2493                                 this.tシナリオ_DragDropされたファイルを開く( data );\r
2494                         }\r
2495                 }\r
2496                 private void Cメインフォーム_DragEnter( object sender, DragEventArgs e )\r
2497                 {\r
2498                         if( e.Data.GetDataPresent( DataFormats.FileDrop ) )\r
2499                         {\r
2500                                 e.Effect = DragDropEffects.Copy;\r
2501                         }\r
2502                         else\r
2503                         {\r
2504                                 e.Effect = DragDropEffects.None;\r
2505                         }\r
2506                 }\r
2507                 private void Cメインフォーム_FormClosing( object sender, FormClosingEventArgs e )\r
2508                 {\r
2509                         if( this.t未保存なら保存する() == DialogResult.Cancel )\r
2510                         {\r
2511                                 e.Cancel = true;\r
2512                         }\r
2513                         else\r
2514                         {\r
2515                                 this.tアプリ終了時に行う終了処理();\r
2516                         }\r
2517                 }\r
2518                 private void Cメインフォーム_Load( object sender, EventArgs e )\r
2519                 {\r
2520                         this.tアプリ起動時に一度だけ行う初期化処理();\r
2521                         // this.t譜面を初期化する();                                    // 2011.8.29 yyagi; removed this.t譜面を初期化する() because it has already done in this.tアプリ起動時に一度だけ行う初期化処理().\r
2522                 }\r
2523                 //-----------------\r
2524                 #endregion\r
2525                 #region [ GUIイベント:pictureBox譜面パネル、Panel2、スクロールバー関連 ]\r
2526                 //-----------------\r
2527                 private void pictureBox譜面パネル_MouseClick( object sender, MouseEventArgs e )\r
2528                 {\r
2529                         // フォーカスを得る。\r
2530 \r
2531                         this.pictureBox譜面パネル.Focus();\r
2532 \r
2533 \r
2534                         // 選択・編集のいずれかの管理者へ処理を引き継ぐ。\r
2535 \r
2536                         if( this.b選択モードである )\r
2537                         {\r
2538                                 this.mgr選択モード管理者.MouseClick( e );\r
2539                         }\r
2540                         else\r
2541                         {\r
2542                                 this.mgr編集モード管理者.MouseClick( e );\r
2543                         }\r
2544                 }\r
2545                 private void pictureBox譜面パネル_MouseDown( object sender, MouseEventArgs e )\r
2546                 {\r
2547                         if( this.b選択モードである )\r
2548                                 this.mgr選択モード管理者.MouseDown( e );\r
2549                 }\r
2550                 private void pictureBox譜面パネル_MouseEnter( object sender, EventArgs e )\r
2551                 {\r
2552                         #region [ オートフォーカスが有効の場合、譜面にマウスが入ったら譜面がフォーカスを得る。 ]\r
2553                         //-----------------\r
2554                         if( this.appアプリ設定.AutoFocus )\r
2555                                 this.pictureBox譜面パネル.Focus();\r
2556                         //-----------------\r
2557                         #endregion\r
2558                 }\r
2559                 private void pictureBox譜面パネル_MouseLeave( object sender, EventArgs e )\r
2560                 {\r
2561                         if( this.b編集モードである )\r
2562                                 this.mgr編集モード管理者.MouseLeave( e );\r
2563                 }\r
2564                 private void pictureBox譜面パネル_MouseMove( object sender, MouseEventArgs e )\r
2565                 {\r
2566                         // 選択・編集のいずれかの管理者へ処理を引き継ぐ。\r
2567 \r
2568                         if( this.b選択モードである )\r
2569                         {\r
2570                                 this.mgr選択モード管理者.MouseMove( e );\r
2571                         }\r
2572                         else\r
2573                         {\r
2574                                 this.mgr編集モード管理者.MouseMove( e );\r
2575                         }\r
2576                 }\r
2577                 private void pictureBox譜面パネル_Paint( object sender, PaintEventArgs e )\r
2578                 {\r
2579                         if( this.mgr譜面管理者 == null )\r
2580                                 return;         // まだ初期化が終わってないうちに Paint が呼び出される場合がある。\r
2581 \r
2582                         #region [ 小節数が変わってたら、スクロールバーの値域を調整する。]\r
2583                         //-----------------\r
2584                         int n全譜面の高さgrid = this.mgr譜面管理者.n全小節の高さgridの合計を返す();\r
2585 \r
2586                         if( this.vScrollBar譜面用垂直スクロールバー.Maximum != n全譜面の高さgrid - 1 )        // 小節数が変わっている\r
2587                         {\r
2588                                 // 譜面の高さ(grid)がどれだけ変わったか?\r
2589 \r
2590                                 int n増加分grid = ( n全譜面の高さgrid - 1 ) - this.vScrollBar譜面用垂直スクロールバー.Maximum;\r
2591 \r
2592 \r
2593                                 // スクロールバーを調整。\r
2594 \r
2595                                 #region [ スクロールバーの状態を新しい譜面の高さに合わせる。]\r
2596                                 //-----------------\r
2597                                 this.vScrollBar譜面用垂直スクロールバー.Maximum = n全譜面の高さgrid - 1;\r
2598 \r
2599                                 if( ( this.vScrollBar譜面用垂直スクロールバー.Value + n増加分grid ) < 0 )\r
2600                                 {\r
2601                                         this.vScrollBar譜面用垂直スクロールバー.Value = 0;\r
2602                                 }\r
2603                                 else\r
2604                                 {\r
2605                                         this.vScrollBar譜面用垂直スクロールバー.Value += n増加分grid;\r
2606                                 }\r
2607                                 //-----------------\r
2608                                 #endregion\r
2609 \r
2610 \r
2611                                 // 譜面表示下辺の位置を更新。\r
2612 \r
2613                                 #region [ 譜面表示下辺の位置を更新する。 ]\r
2614                                 //-----------------\r
2615                                 this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid =\r
2616                                         ( ( this.vScrollBar譜面用垂直スクロールバー.Maximum - this.vScrollBar譜面用垂直スクロールバー.LargeChange ) + 1 ) - this.vScrollBar譜面用垂直スクロールバー.Value;\r
2617                                 //-----------------\r
2618                                 #endregion\r
2619                         }\r
2620                         //-----------------\r
2621                         #endregion\r
2622 \r
2623                         #region [ 譜面を描画する。]\r
2624                         //-----------------\r
2625                         int nPicBoxの幅 = this.pictureBox譜面パネル.ClientSize.Width;\r
2626                         int nPanel2の幅 = this.splitContainerタブと譜面を分割.Panel2.Width;\r
2627 \r
2628                         var rc可視領域 = new Rectangle() {\r
2629                                 X = -this.pictureBox譜面パネル.Location.X,\r
2630                                 Y = 0,\r
2631                                 Width = ( nPanel2の幅 > nPicBoxの幅 ) ? nPicBoxの幅 : nPanel2の幅,\r
2632                                 Height = this.pictureBox譜面パネル.ClientSize.Height,\r
2633                         };\r
2634 \r
2635                         this.mgr譜面管理者.t譜面を描画する( e.Graphics, this.pictureBox譜面パネル.ClientSize, rc可視領域 );\r
2636                         //-----------------\r
2637                         #endregion\r
2638 \r
2639                         #region [ 現在のモード管理者の Paint() を呼び出す。]\r
2640                         //-----------------\r
2641                         if( this.b選択モードである )\r
2642                         {\r
2643                                 if( this.mgr選択モード管理者 != null )\r
2644                                         this.mgr選択モード管理者.Paint( e );\r
2645                         }\r
2646                         else\r
2647                         {\r
2648                                 if( this.mgr編集モード管理者 != null )\r
2649                                         this.mgr編集モード管理者.Paint( e );\r
2650                         }\r
2651                         //-----------------\r
2652                         #endregion\r
2653                 }\r
2654                 private void pictureBox譜面パネル_PreviewKeyDown( object sender, PreviewKeyDownEventArgs e )\r
2655                 {\r
2656                         if( e.KeyCode == Keys.Prior )\r
2657                         {\r
2658                                 #region [ PageUp → 移動量に対応する grid だけ垂直つまみを移動させる。あとはこの移動で生じる ChangedValue イベントで処理。]\r
2659                                 //-----------------\r
2660                                 int n移動すべき数grid = -C小節.n基準の高さgrid;\r
2661                                 int n新しい位置 = this.vScrollBar譜面用垂直スクロールバー.Value + n移動すべき数grid;\r
2662                                 int n最小値 = this.vScrollBar譜面用垂直スクロールバー.Minimum;\r
2663                                 int n最大値 = ( this.vScrollBar譜面用垂直スクロールバー.Maximum + 1 ) - this.vScrollBar譜面用垂直スクロールバー.LargeChange;\r
2664 \r
2665                                 if( n新しい位置 < n最小値 )\r
2666                                 {\r
2667                                         n新しい位置 = n最小値;\r
2668                                 }\r
2669                                 else if( n新しい位置 > n最大値 )\r
2670                                 {\r
2671                                         n新しい位置 = n最大値;\r
2672                                 }\r
2673 \r
2674                                 this.vScrollBar譜面用垂直スクロールバー.Value = n新しい位置;\r
2675                                 //-----------------\r
2676                                 #endregion\r
2677                         }\r
2678                         else if( e.KeyCode == Keys.Next )\r
2679                         {\r
2680                                 #region [ PageDown → 移動量に対応する grid だけ垂直つまみを移動させる。あとはこの移動で生じる ChangedValue イベントで処理。]\r
2681                                 //-----------------\r
2682                                 int n移動すべき数grid = C小節.n基準の高さgrid;\r
2683                                 int n新しい位置 = this.vScrollBar譜面用垂直スクロールバー.Value + n移動すべき数grid;\r
2684                                 int n最小値 = this.vScrollBar譜面用垂直スクロールバー.Minimum;\r
2685                                 int n最大値 = ( this.vScrollBar譜面用垂直スクロールバー.Maximum + 1 ) - this.vScrollBar譜面用垂直スクロールバー.LargeChange;\r
2686 \r
2687                                 if( n新しい位置 < n最小値 )\r
2688                                 {\r
2689                                         n新しい位置 = n最小値;\r
2690                                 }\r
2691                                 else if( n新しい位置 > n最大値 )\r
2692                                 {\r
2693                                         n新しい位置 = n最大値;\r
2694                                 }\r
2695 \r
2696                                 this.vScrollBar譜面用垂直スクロールバー.Value = n新しい位置;\r
2697                                 //-----------------\r
2698                                 #endregion\r
2699                         }\r
2700                 }\r
2701 \r
2702                 private void splitContainerタブと譜面を分割_MouseWheel( object sender, MouseEventArgs e )\r
2703                 {\r
2704                         if ( ( Control.ModifierKeys & Keys.Shift ) == Keys.Shift )\r
2705                         {\r
2706                                 #region [ Shiftを押しながらホイール操作すると、横スクロール。]\r
2707                                 if ( e.Delta == 0 )\r
2708                                         return;         // 移動量なし\r
2709 \r
2710                                 // e.Delta は、スクロールバーを下へ動かしたいときに負、上へ動かしたいときに正となる。\r
2711 \r
2712                                 int n移動すべき行数 = ( -e.Delta * SystemInformation.MouseWheelScrollLines ) / 120;\r
2713 \r
2714                                 // 1行=1レーン とする。(が、実際には適当に設定しただけ。1レーンには設定していない)\r
2715 \r
2716                                 int n移動すべき数grid = n移動すべき行数 * 16;\r
2717 \r
2718 \r
2719                                 // スクロールバーのつまみを移動。\r
2720 \r
2721                                 int n新しい位置 = this.hScrollBar譜面用水平スクロールバー.Value + n移動すべき数grid;\r
2722                                 int n最小値 = this.hScrollBar譜面用水平スクロールバー.Minimum;\r
2723                                 int n最大値 = ( this.hScrollBar譜面用水平スクロールバー.Maximum + 1 ) - this.hScrollBar譜面用水平スクロールバー.LargeChange;\r
2724 \r
2725                                 if ( n新しい位置 < n最小値 )\r
2726                                 {\r
2727                                         n新しい位置 = n最小値;\r
2728                                 }\r
2729                                 else if ( n新しい位置 > n最大値 )\r
2730                                 {\r
2731                                         n新しい位置 = n最大値;\r
2732                                 }\r
2733 \r
2734                                 this.hScrollBar譜面用水平スクロールバー.Value = n新しい位置;\r
2735                                 //-----------------\r
2736                                 #endregion\r
2737                         }\r
2738                         else\r
2739                         {\r
2740                                 #region [ 移動量に対応する grid だけ垂直つまみを移動させる。あとはこの移動で生じる ChangedValue イベントで処理する。]\r
2741                                 //-----------------\r
2742                                 if ( e.Delta == 0 )\r
2743                                         return;         // 移動量なし\r
2744 \r
2745 \r
2746                                 // e.Delta は、スクロールバーを下へ動かしたいときに負、上へ動かしたいときに正となる。\r
2747 \r
2748                                 int n移動すべき行数 = ( -e.Delta * SystemInformation.MouseWheelScrollLines ) / 120;\r
2749 \r
2750 \r
2751                                 // 1行=1拍(64/4=16グリッド)とする。\r
2752 \r
2753                                 int n移動すべき数grid = n移動すべき行数 * 16;\r
2754 \r
2755 \r
2756                                 // スクロールバーのつまみを移動。\r
2757 \r
2758                                 int n新しい位置 = this.vScrollBar譜面用垂直スクロールバー.Value + n移動すべき数grid;\r
2759                                 int n最小値 = this.vScrollBar譜面用垂直スクロールバー.Minimum;\r
2760                                 int n最大値 = ( this.vScrollBar譜面用垂直スクロールバー.Maximum + 1 ) - this.vScrollBar譜面用垂直スクロールバー.LargeChange;\r
2761 \r
2762                                 if ( n新しい位置 < n最小値 )\r
2763                                 {\r
2764                                         n新しい位置 = n最小値;\r
2765                                 }\r
2766                                 else if ( n新しい位置 > n最大値 )\r
2767                                 {\r
2768                                         n新しい位置 = n最大値;\r
2769                                 }\r
2770 \r
2771                                 this.vScrollBar譜面用垂直スクロールバー.Value = n新しい位置;\r
2772                                 //-----------------\r
2773                                 #endregion\r
2774                         }\r
2775                 }\r
2776                 private void splitContainerタブと譜面を分割_Panel2_SizeChanged( object sender, EventArgs e )\r
2777                 {\r
2778                         if( this.mgr譜面管理者 != null )   // 初期化前に呼び出されることがある。\r
2779                         {\r
2780                                 this.mgr譜面管理者.t水平スクロールバーと譜面パネル左右位置の調整();\r
2781                                 this.mgr譜面管理者.t垂直スクロールバーと譜面可視領域の上下位置の調整();\r
2782                         }\r
2783                 }\r
2784 \r
2785                 private void hScrollBar譜面用水平スクロールバー_ValueChanged( object sender, EventArgs e )\r
2786                 {\r
2787                         if( this.mgr譜面管理者 != null )\r
2788                                 this.mgr譜面管理者.t水平スクロールバーと譜面パネル左右位置の調整();\r
2789                 }\r
2790                 private void vScrollBar譜面用垂直スクロールバー_ValueChanged( object sender, EventArgs e )\r
2791                 {\r
2792                         if( mgr譜面管理者 != null )\r
2793                                 this.mgr譜面管理者.t垂直スクロールバーと譜面可視領域の上下位置の調整();\r
2794                 }\r
2795                 //-----------------\r
2796                 #endregion\r
2797                 #region [ GUIイベント:譜面右メニュー関連 ]\r
2798                 //-----------------\r
2799                 private void toolStripMenuItem選択チップの切り取り_Click( object sender, EventArgs e )\r
2800                 {\r
2801                         this.tシナリオ_切り取り();\r
2802                 }\r
2803                 private void toolStripMenuItem選択チップのコピー_Click( object sender, EventArgs e )\r
2804                 {\r
2805                         this.tシナリオ_コピー();\r
2806                 }\r
2807                 private void toolStripMenuItem選択チップの貼り付け_Click( object sender, EventArgs e )\r
2808                 {\r
2809                         // クリックされた座標を取得。\r
2810 \r
2811                         Point ptMenu = new Point( this.contextMenuStrip譜面右メニュー.Left, this.contextMenuStrip譜面右メニュー.Top );\r
2812                         Point ptMenuClient = this.contextMenuStrip譜面右メニュー.SourceControl.PointToClient( ptMenu );\r
2813 \r
2814 \r
2815                         // Y座標から位置gridを得て、そこへ貼り付ける。\r
2816 \r
2817                         this.tシナリオ_貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptMenuClient.Y ) );\r
2818                 }\r
2819                 private void toolStripMenuItem選択チップの削除_Click( object sender, EventArgs e )\r
2820                 {\r
2821                         this.tシナリオ_削除();\r
2822                 }\r
2823 \r
2824                 private void toolStripMenuItemすべてのチップの選択_Click( object sender, EventArgs e )\r
2825                 {\r
2826                         // 編集モードなら強制的に選択モードにする。\r
2827 \r
2828                         if( this.b編集モードである )\r
2829                                 this.t選択モードにする();\r
2830 \r
2831 \r
2832                         // 全チップを選択。\r
2833 \r
2834                         this.mgr選択モード管理者.t全チップを選択する();\r
2835                 }\r
2836                 private void toolStripMenuItemレーン内のすべてのチップの選択_Click( object sender, EventArgs e )\r
2837                 {\r
2838                         // 編集モードなら強制的に選択モードにする。\r
2839 \r
2840                         if ( this.b編集モードである )\r
2841                                 this.t選択モードにする();\r
2842 \r
2843                         // メニューが開かれたときのマウスの座標を取得。\r
2844                         // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、\r
2845                         //  メニューの表示位置からは取得しないこと。\r
2846 \r
2847                         Point ptマウスの位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;\r
2848 \r
2849 \r
2850                         // マウス位置に小節を挿入。\r
2851 \r
2852                         #region [ クリックされた箇所のレーン番号を取得する。]\r
2853                         //-----------------\r
2854                         int lane = this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X );\r
2855                         if ( lane < 0 )\r
2856                                 return;         // クリックされた箇所にレーンがない\r
2857 \r
2858                         //-----------------\r
2859                         #endregion\r
2860 \r
2861                         this.mgr選択モード管理者.tレーン上の全チップを選択する( lane );\r
2862 \r
2863                 }\r
2864                 private void toolStripMenuItemレーン内のすべてのチップの選択_特定小節以降_Click( object sender, EventArgs e )\r
2865                 {\r
2866                         // 編集モードなら強制的に選択モードにする。\r
2867 \r
2868                         if ( this.b編集モードである )\r
2869                                 this.t選択モードにする();\r
2870 \r
2871                         // メニューが開かれたときのマウスの座標を取得。\r
2872                         // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、\r
2873                         //  メニューの表示位置からは取得しないこと。\r
2874 \r
2875                         Point ptマウスの位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;\r
2876 \r
2877                         #region [ クリックされた箇所のレーン番号を取得する。]\r
2878                         //-----------------\r
2879                         int lane = this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X );\r
2880                         if ( lane < 0 )\r
2881                                 return;         // クリックされた箇所にレーンがない\r
2882 \r
2883                         //-----------------\r
2884                         #endregion\r
2885                         #region [ クリックされた箇所の小節を取得する。]\r
2886                         //-----------------\r
2887                         if ( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X ) < 0 )\r
2888                                 return;         // クリックされた箇所にレーンがない\r
2889 \r
2890                         int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y );\r
2891 \r
2892                         C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
2893                         //-----------------\r
2894                         #endregion\r
2895 \r
2896                         this.mgr選択モード管理者.tレーン上の全チップを選択する( lane, csクリックされた小節.n小節番号0to3599 );\r
2897                 }\r
2898 \r
2899                 private void toolStripMenuItem小節内のすべてのチップの選択_Click( object sender, EventArgs e )\r
2900                 {\r
2901                         // 編集モードなら強制的に選択モードにする。\r
2902 \r
2903                         if ( this.b編集モードである )\r
2904                                 this.t選択モードにする();\r
2905 \r
2906                         // メニューが開かれたときのマウスの座標を取得。\r
2907                         // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、\r
2908                         //  メニューの表示位置からは取得しないこと。\r
2909 \r
2910                         Point ptマウスの位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;\r
2911 \r
2912                         #region [ クリックされた箇所の小節を取得する。]\r
2913                         //-----------------\r
2914                         if ( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X ) < 0 )\r
2915                                 return;         // クリックされた箇所にレーンがない\r
2916 \r
2917                         int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y );\r
2918                         C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
2919                         //-----------------\r
2920                         #endregion\r
2921 \r
2922                         this.mgr選択モード管理者.t小節上の全チップを選択する( csクリックされた小節.n小節番号0to3599 );\r
2923                 }\r
2924 \r
2925                 private void toolStripMenuItem小節長変更_Click( object sender, EventArgs e )\r
2926                 {\r
2927                         // メニューが開かれたときのマウスの座標を取得。\r
2928                         // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、\r
2929                         //  メニューの表示位置からは取得しないこと。\r
2930 \r
2931                         Point ptマウス位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;\r
2932 \r
2933 \r
2934                         // 小節の小節長を変更。\r
2935 \r
2936                         #region [ クリックされた小節を取得する。]\r
2937                         //-----------------\r
2938                         if( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウス位置.X ) < 0 )\r
2939                                 return;         // クリックされた箇所にレーンがないなら無視。\r
2940 \r
2941                         int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウス位置.Y );\r
2942                         C小節 csクリックされた小節 =  this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
2943                         //-----------------\r
2944                         #endregion\r
2945 \r
2946                         #region [ 取得した小節の小節長を変更する。]\r
2947                         //-----------------\r
2948                         if( csクリックされた小節 != null )\r
2949                                 this.tシナリオ_小節長を変更する( csクリックされた小節 );\r
2950                         //-----------------\r
2951                         #endregion\r
2952                 }\r
2953                 private void toolStripMenuItem小節の挿入_Click( object sender, EventArgs e )\r
2954                 {\r
2955                         // メニューが開かれたときのマウスの座標を取得。\r
2956                         // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、\r
2957                         //  メニューの表示位置からは取得しないこと。\r
2958 \r
2959                         Point ptマウスの位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;\r
2960 \r
2961 \r
2962                         // マウス位置に小節を挿入。\r
2963 \r
2964                         #region [ クリックされた箇所の小節を取得する。]\r
2965                         //-----------------\r
2966                         if( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウスの位置.X ) < 0 )\r
2967                                 return;         // クリックされた箇所にレーンがない\r
2968 \r
2969                         int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y );\r
2970                         C小節 csクリックされた小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
2971                         //-----------------\r
2972                         #endregion\r
2973 \r
2974                         #region [ 該当小節の下へ新しい小節を挿入する。]\r
2975                         //-----------------\r
2976                         if( csクリックされた小節 != null )\r
2977                                 this.tシナリオ_小節を挿入する( csクリックされた小節.n小節番号0to3599 );\r
2978                         //-----------------\r
2979                         #endregion\r
2980                 }\r
2981                 private void toolStripMenuItem小節の削除_Click( object sender, EventArgs e )\r
2982                 {\r
2983                         // メニューが開かれたときのマウスの座標を取得。\r
2984                         // ※メニューは必ずマウス位置を左上にして表示されるとは限らないため、\r
2985                         //  メニューの表示位置からは取得しないこと。\r
2986 \r
2987                         Point ptマウス位置 = this.pt選択モードのコンテクストメニューを開いたときのマウスの位置;\r
2988 \r
2989 \r
2990                         // マウス位置にある小節を削除。\r
2991 \r
2992                         #region [ クリックされた箇所の小節を取得する。 ]\r
2993                         //-----------------\r
2994                         if( this.mgr譜面管理者.nX座標dotが位置するレーン番号を返す( ptマウス位置.X ) < 0 )\r
2995                                 return;         // クリックされた箇所にレーンがないなら無視。\r
2996 \r
2997                         int n譜面先頭からの位置grid = this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウス位置.Y );\r
2998                         C小節 cs削除する小節 = this.mgr譜面管理者.p譜面先頭からの位置gridを含む小節を返す( n譜面先頭からの位置grid );\r
2999                         //-----------------\r
3000                         #endregion\r
3001 \r
3002                         #region [ 該当小節を削除する。]\r
3003                         //-----------------\r
3004                         if( cs削除する小節 != null )\r
3005                                 this.tシナリオ_小節を削除する( cs削除する小節.n小節番号0to3599 );\r
3006                         //-----------------\r
3007                         #endregion\r
3008                 }\r
3009                 //-----------------\r
3010                 #endregion\r
3011                 \r
3012                 #region [ GUIイベント:基本情報関連 ]\r
3013                 //-----------------\r
3014                 #region [ Title ]\r
3015                 private string textBox曲名_以前の値 = "";\r
3016                 private void textBox曲名_TextChanged( object sender, EventArgs e )\r
3017                 {\r
3018                         // Undo/Redo リストを修正する。\r
3019 \r
3020                         #region [ Undo/Redo リストを修正。]\r
3021                         //-----------------\r
3022                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
3023                         {\r
3024                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3025 \r
3026                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBox曲名 ) )\r
3027                                 {\r
3028                                         // 既存のセルの値を更新。\r
3029 \r
3030                                         ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBox曲名.Text;\r
3031                                 }\r
3032                                 else\r
3033                                 {\r
3034                                         // 新しいセルを追加。\r
3035 \r
3036                                         this.mgrUndoRedo管理者.tノードを追加する( \r
3037                                                 new CUndoRedoセル<string>(\r
3038                                                         this.textBox曲名,\r
3039                                                         new DGUndoを実行する<string>( this.textBox曲名_Undo ),\r
3040                                                         new DGRedoを実行する<string>( this.textBox曲名_Redo ),\r
3041                                                         this.textBox曲名_以前の値, this.textBox曲名.Text ) );\r
3042 \r
3043 \r
3044                                         // Undo ボタンを有効にする。\r
3045 \r
3046                                         this.tUndoRedo用GUIの有効無効を設定する();\r
3047                                 }\r
3048                         }\r
3049                         //-----------------\r
3050                         #endregion\r
3051 \r
3052 \r
3053                         // Undo 用に値を保管しておく。\r
3054 \r
3055                         this.textBox曲名_以前の値 = this.textBox曲名.Text;\r
3056 \r
3057 \r
3058                         // 完了。\r
3059 \r
3060                         CUndoRedo管理.bUndoRedoした直後 = false;\r
3061                         this.b未保存 = true;\r
3062                 }\r
3063                 private void textBox曲名_Leave( object sender, EventArgs e )\r
3064                 {\r
3065                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3066 \r
3067                         if( oセル仮想 != null )\r
3068                                 oセル仮想.t所有権の放棄( this.textBox曲名 );\r
3069                 }\r
3070                 private void textBox曲名_Undo( string str変更前, string str変更後 )\r
3071                 {\r
3072                         // 変更前の値に戻す。\r
3073 \r
3074                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3075 \r
3076                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3077                         this.textBox曲名.Text = str変更前;\r
3078 \r
3079                         this.textBox曲名.Focus();\r
3080                 }\r
3081                 private void textBox曲名_Redo( string str変更前, string str変更後 )\r
3082                 {\r
3083                         // 変更後の値に戻す。\r
3084 \r
3085                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3086 \r
3087                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3088                         this.textBox曲名.Text = str変更後;\r
3089 \r
3090                         this.textBox曲名.Focus();\r
3091                 }\r
3092                 #endregion\r
3093                 #region [ Author ]\r
3094                 private string textBox製作者_以前の値 = "";\r
3095                 private void textBox製作者_TextChanged( object sender, EventArgs e )\r
3096                 {\r
3097                         // Undo/Redo リストを修正する。\r
3098 \r
3099                         #region [ Undo/Redo リストを修正。]\r
3100                         //-----------------\r
3101                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
3102                         {\r
3103                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3104 \r
3105                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBox製作者 ) )\r
3106                                 {\r
3107                                         // 既存のセルの値を更新。\r
3108 \r
3109                                         ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBox製作者.Text;\r
3110                                 }\r
3111                                 else\r
3112                                 {\r
3113                                         // 新しいセルを追加。\r
3114 \r
3115                                         this.mgrUndoRedo管理者.tノードを追加する(\r
3116                                                 new CUndoRedoセル<string>(\r
3117                                                         this.textBox製作者, \r
3118                                                         new DGUndoを実行する<string>( this.textBox製作者_Undo ),\r
3119                                                         new DGRedoを実行する<string>( this.textBox製作者_Redo ),\r
3120                                                         this.textBox製作者_以前の値, this.textBox製作者.Text ) );\r
3121 \r
3122 \r
3123                                         // Undo ボタンを有効にする。\r
3124 \r
3125                                         this.tUndoRedo用GUIの有効無効を設定する();\r
3126                                 }\r
3127                         }\r
3128                         //-----------------\r
3129                         #endregion\r
3130 \r
3131 \r
3132                         // Undo 用に値を保管しておく。\r
3133 \r
3134                         this.textBox製作者_以前の値 = this.textBox製作者.Text;\r
3135 \r
3136 \r
3137                         // 完了。\r
3138 \r
3139                         CUndoRedo管理.bUndoRedoした直後 = false;\r
3140                         this.b未保存 = true;\r
3141                 }\r
3142                 private void textBox製作者_Leave( object sender, EventArgs e )\r
3143                 {\r
3144                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3145                 \r
3146                         if( oセル仮想 != null )\r
3147                                 oセル仮想.t所有権の放棄( this.textBox製作者 );\r
3148                 }\r
3149                 private void textBox製作者_Undo( string str変更前, string str変更後 )\r
3150                 {\r
3151                         // 変更前の値に戻す。\r
3152 \r
3153                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3154 \r
3155                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3156                         this.textBox製作者.Text = str変更前;\r
3157 \r
3158                         this.textBox製作者.Focus();\r
3159                 }\r
3160                 private void textBox製作者_Redo( string str変更前, string str変更後 )\r
3161                 {\r
3162                         // 変更後の値に戻す。\r
3163 \r
3164                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3165 \r
3166                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3167                         this.textBox製作者.Text = str変更後;\r
3168 \r
3169                         this.textBox製作者.Focus();\r
3170                 }\r
3171                 #endregion\r
3172                 #region [ Comment ]\r
3173                 private string textBoxコメント_以前の値 = "";\r
3174                 private void textBoxコメント_TextChanged( object sender, EventArgs e )\r
3175                 {\r
3176                         // Undo/Redo リストを修正する。\r
3177 \r
3178                         #region [ Undo/Redo リストを修正。]\r
3179                         //-----------------\r
3180                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
3181                         {\r
3182                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3183 \r
3184                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxコメント ) )\r
3185                                 {\r
3186                                         // 既存のセルの値を更新。\r
3187 \r
3188                                         ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxコメント.Text;\r
3189                                 }\r
3190                                 else\r
3191                                 {\r
3192                                         // 新しいセルを追加。\r
3193 \r
3194                                         this.mgrUndoRedo管理者.tノードを追加する(\r
3195                                                 new CUndoRedoセル<string>( \r
3196                                                         this.textBoxコメント, \r
3197                                                         new DGUndoを実行する<string>( this.textBoxコメント_Undo ), \r
3198                                                         new DGRedoを実行する<string>( this.textBoxコメント_Redo ),\r
3199                                                         this.textBoxコメント_以前の値, this.textBoxコメント.Text ) );\r
3200 \r
3201                                         // Undo ボタンを有効にする。\r
3202 \r
3203                                         this.tUndoRedo用GUIの有効無効を設定する();\r
3204                                 }\r
3205                         }\r
3206                         //-----------------\r
3207                         #endregion\r
3208 \r
3209 \r
3210                         // Undo 用に値を保管しておく。\r
3211 \r
3212                         this.textBoxコメント_以前の値 = this.textBoxコメント.Text;\r
3213 \r
3214 \r
3215                         // 完了。\r
3216 \r
3217                         CUndoRedo管理.bUndoRedoした直後 = false;\r
3218                         this.b未保存 = true;\r
3219                 }\r
3220                 private void textBoxコメント_Leave( object sender, EventArgs e )\r
3221                 {\r
3222                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3223                 \r
3224                         if( oセル仮想 != null )\r
3225                                 oセル仮想.t所有権の放棄( this.textBoxコメント );\r
3226                 }\r
3227                 private void textBoxコメント_Undo( string str変更前, string str変更後 )\r
3228                 {\r
3229                         // 変更前の値に戻す。\r
3230 \r
3231                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3232 \r
3233                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3234                         this.textBoxコメント.Text = str変更前;\r
3235 \r
3236                         this.textBoxコメント.Focus();\r
3237                 }\r
3238                 private void textBoxコメント_Redo( string str変更前, string str変更後 )\r
3239                 {\r
3240                         // 変更後の値に戻す。\r
3241 \r
3242                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3243 \r
3244                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3245                         this.textBoxコメント.Text = str変更後;\r
3246 \r
3247                         this.textBoxコメント.Focus();\r
3248                 }\r
3249                 #endregion\r
3250                 #region [ Genre ]\r
3251                 private string textBoxGenre_以前の値 = "";\r
3252                 private void textBoxGenre_TextChanged( object sender, EventArgs e )\r
3253                 {\r
3254                         // Undo/Redo リストを修正する。\r
3255 \r
3256                         #region [ Undo/Redo リストを修正。]\r
3257                         //-----------------\r
3258                         if ( !CUndoRedo管理.bUndoRedoした直後 )\r
3259                         {\r
3260                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3261 \r
3262                                 if ( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxGenre ) )\r
3263                                 {\r
3264                                         // 既存のセルの値を更新。\r
3265 \r
3266                                         ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxGenre.Text;\r
3267                                 }\r
3268                                 else\r
3269                                 {\r
3270                                         // 新しいセルを追加。\r
3271 \r
3272                                         this.mgrUndoRedo管理者.tノードを追加する(\r
3273                                                 new CUndoRedoセル<string>(\r
3274                                                         this.textBoxGenre,\r
3275                                                         new DGUndoを実行する<string>( this.textBoxGenre_Undo ),\r
3276                                                         new DGRedoを実行する<string>( this.textBoxGenre_Redo ),\r
3277                                                         this.textBoxGenre_以前の値, this.textBoxGenre.Text ) );\r
3278 \r
3279                                         // Undo ボタンを有効にする。\r
3280 \r
3281                                         this.tUndoRedo用GUIの有効無効を設定する();\r
3282                                 }\r
3283                         }\r
3284                         //-----------------\r
3285                         #endregion\r
3286 \r
3287 \r
3288                         // Undo 用に値を保管しておく。\r
3289 \r
3290                         this.textBoxGenre_以前の値 = this.textBoxGenre.Text;\r
3291 \r
3292 \r
3293                         // 完了。\r
3294 \r
3295                         CUndoRedo管理.bUndoRedoした直後 = false;\r
3296                         this.b未保存 = true;\r
3297                 }\r
3298                 private void textBoxGenre_Leave( object sender, EventArgs e )\r
3299                 {\r
3300                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3301 \r
3302                         if ( oセル仮想 != null )\r
3303                                 oセル仮想.t所有権の放棄( this.textBoxGenre );\r
3304                 }\r
3305                 private void textBoxGenre_Undo( string str変更前, string str変更後 )\r
3306                 {\r
3307                         // 変更前の値に戻す。\r
3308 \r
3309                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3310 \r
3311                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3312                         this.textBoxGenre.Text = str変更前;\r
3313 \r
3314                         this.textBoxGenre.Focus();\r
3315                 }\r
3316                 private void textBoxGenre_Redo( string str変更前, string str変更後 )\r
3317                 {\r
3318                         // 変更後の値に戻す。\r
3319 \r
3320                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3321 \r
3322                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3323                         this.textBoxGenre.Text = str変更後;\r
3324 \r
3325                         this.textBoxGenre.Focus();\r
3326                 }\r
3327                 #endregion\r
3328 \r
3329                 #region [ BPM ]\r
3330                 private decimal numericUpDownBPM_以前の値 = 120.0M;\r
3331                 private void numericUpDownBPM_ValueChanged( object sender, EventArgs e )\r
3332                 {\r
3333                         // Undo/Redo リストを修正する。\r
3334 \r
3335                         #region [ Undo/Redo リストの修正。]\r
3336                         //-----------------\r
3337                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
3338                         {\r
3339                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3340 \r
3341                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.numericUpDownBPM ) )\r
3342                                 {\r
3343                                         // 既存のセルの値を更新。\r
3344 \r
3345                                         ( (CUndoRedoセル<decimal>) oセル仮想 ).変更後の値 = this.numericUpDownBPM.Value;\r
3346                                 }\r
3347                                 else\r
3348                                 {\r
3349                                         // 新しいセルを追加。\r
3350 \r
3351                                         this.mgrUndoRedo管理者.tノードを追加する(\r
3352                                                 new CUndoRedoセル<decimal>(\r
3353                                                         this.numericUpDownBPM,\r
3354                                                         new DGUndoを実行する<decimal>( this.numericUpDownBPM_Undo ), \r
3355                                                         new DGRedoを実行する<decimal>( this.numericUpDownBPM_Redo ),\r
3356                                                         this.numericUpDownBPM_以前の値, this.numericUpDownBPM.Value ) );\r
3357 \r
3358 \r
3359                                         // Undoボタンを有効にする。\r
3360 \r
3361                                         this.tUndoRedo用GUIの有効無効を設定する();\r
3362                                 }\r
3363                         }\r
3364                         //-----------------\r
3365                         #endregion\r
3366 \r
3367                         \r
3368                         // Undo 用に値を保管しておく。\r
3369 \r
3370                         this.numericUpDownBPM_以前の値 = this.numericUpDownBPM.Value;\r
3371 \r
3372 \r
3373                         // 完了。\r
3374 \r
3375                         CUndoRedo管理.bUndoRedoした直後 = false;\r
3376                         this.b未保存 = true;\r
3377                 }\r
3378                 private void numericUpDownBPM_Leave( object sender, EventArgs e )\r
3379                 {\r
3380                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3381                 \r
3382                         if( oセル仮想 != null )\r
3383                                 oセル仮想.t所有権の放棄( this.numericUpDownBPM );\r
3384                 }\r
3385                 private void numericUpDownBPM_Undo( decimal dec変更前, decimal dec変更後 )\r
3386                 {\r
3387                         // 変更前の値に戻す。\r
3388 \r
3389                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3390 \r
3391                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3392                         this.numericUpDownBPM.Value = dec変更前;\r
3393 \r
3394                         this.numericUpDownBPM.Focus();\r
3395                 }\r
3396                 private void numericUpDownBPM_Redo( decimal dec変更前, decimal dec変更後 )\r
3397                 {\r
3398                         // 変更後の値に戻す。\r
3399 \r
3400                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3401 \r
3402                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3403                         this.numericUpDownBPM.Value = dec変更後;\r
3404 \r
3405                         this.numericUpDownBPM.Focus();\r
3406                 }\r
3407                 #endregion\r
3408 \r
3409                 #region [ DLEVEL ]\r
3410                 private int nDLEVEL_以前の値 = 50;\r
3411                 private void textBoxDLEVEL_TextChanged( object sender, EventArgs e )\r
3412                 {\r
3413                         // 何もしない。→ 数字以外が入力されていることもあるため、Leaveまで待つ。\r
3414                 }\r
3415                 private void textBoxDLEVEL_Leave( object sender, EventArgs e )\r
3416                 {\r
3417                         if( this.textBoxDLEVEL.Text.Length > 0 )\r
3418                         {\r
3419                                 // 数値チェック。\r
3420 \r
3421                                 int n値;\r
3422                                 if( !int.TryParse( this.textBoxDLEVEL.Text, out n値 ) )\r
3423                                 {\r
3424                                         n値 = 0;\r
3425                                 }\r
3426                                 else if( n値 < 0 )\r
3427                                 {\r
3428                                         n値 = 0;\r
3429                                 }\r
3430                                 else if( n値 > 100 )\r
3431                                 {\r
3432                                         n値 = 100;\r
3433                                 }\r
3434 \r
3435 \r
3436                                 // 値を水平スクロールバーにも反映。\r
3437 \r
3438                                 if( this.hScrollBarDLEVEL.Value != n値 )\r
3439                                 {\r
3440                                         this.t次のプロパティ変更処理がUndoRedoリストに載るようにする();\r
3441                                         this.hScrollBarDLEVEL.Value = n値;     // ここで hScrollBarDLEVEL_ValueChanged が発動 → UndoRedo処理はそちらで。\r
3442                                 }\r
3443                         }\r
3444                 }\r
3445                 private void hScrollBarDLEVEL_ValueChanged( object sender, EventArgs e )\r
3446                 {\r
3447                         // 値をテキストボックスにも反映。\r
3448 \r
3449                         this.textBoxDLEVEL.Text = this.hScrollBarDLEVEL.Value.ToString();\r
3450 \r
3451 \r
3452                         // Undo/Redo リストを修正。\r
3453 \r
3454                         #region [ Undo/Redo リストを修正する。]\r
3455                         //-----------------\r
3456                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
3457                         {\r
3458                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3459 \r
3460                                 if( oセル仮想 != null && oセル仮想.b所有権がある( this.hScrollBarDLEVEL ) )\r
3461                                 {\r
3462                                         // 既存のセルの値を更新。\r
3463 \r
3464                                         ( (CUndoRedoセル<int>) oセル仮想 ).変更後の値 = this.hScrollBarDLEVEL.Value;\r
3465                                 }\r
3466                                 else\r
3467                                 {\r
3468                                         // 新しいセルを追加。\r
3469 \r
3470                                         this.mgrUndoRedo管理者.tノードを追加する( \r
3471                                                 new CUndoRedoセル<int>( \r
3472                                                         this.hScrollBarDLEVEL,\r
3473                                                         new DGUndoを実行する<int>( this.nDLEVEL_Undo ),\r
3474                                                         new DGRedoを実行する<int>( this.nDLEVEL_Redo ), \r
3475                                                         this.nDLEVEL_以前の値, this.hScrollBarDLEVEL.Value ) );\r
3476 \r
3477 \r
3478                                         // Undo ボタンを有効にする。\r
3479 \r
3480                                         this.tUndoRedo用GUIの有効無効を設定する();\r
3481                                 }\r
3482                         }\r
3483                         //-----------------\r
3484                         #endregion\r
3485 \r
3486                         \r
3487                         // Undo 用に値を保管しておく。\r
3488 \r
3489                         this.nDLEVEL_以前の値 = this.hScrollBarDLEVEL.Value;\r
3490 \r
3491 \r
3492                         // 完了。\r
3493 \r
3494                         CUndoRedo管理.bUndoRedoした直後 = false;\r
3495                         this.b未保存 = true;\r
3496                 }\r
3497                 private void nDLEVEL_Undo( int n変更前, int n変更後 )\r
3498                 {\r
3499                         // 変更前の値に戻す。\r
3500 \r
3501                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3502 \r
3503                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3504                         this.textBoxDLEVEL.Text = n変更前.ToString();\r
3505 \r
3506                         this.textBoxDLEVEL.Focus();\r
3507 \r
3508 \r
3509                         // 値を水平スクロールバーにも反映。\r
3510 \r
3511                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3512                         this.hScrollBarDLEVEL.Value = n変更前;\r
3513                 }\r
3514                 private void nDLEVEL_Redo( int n変更前, int n変更後 )\r
3515                 {\r
3516                         // 変更後の値に戻す。\r
3517 \r
3518                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3519 \r
3520                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3521                         this.textBoxDLEVEL.Text = n変更後.ToString();\r
3522 \r
3523                         this.textBoxDLEVEL.Focus();\r
3524 \r
3525 \r
3526                         // 値を水平スクロールバーにも反映。\r
3527 \r
3528                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3529                         this.hScrollBarDLEVEL.Value = n変更後;\r
3530                 }\r
3531                 #endregion\r
3532                 #region [ GLEVEL ]\r
3533                 private int nGLEVEL_以前の値;\r
3534                 private void textBoxGLEVEL_TextChanged( object sender, EventArgs e )\r
3535                 {\r
3536                         // 何もしない。→ 数字以外が入力されていることもあるため、Leaveまで待つ。\r
3537                 }\r
3538                 private void textBoxGLEVEL_Leave( object sender, EventArgs e )\r
3539                 {\r
3540                         if( this.textBoxGLEVEL.Text.Length > 0 )\r
3541                         {\r
3542                                 // 数値チェック。\r
3543 \r
3544                                 int n値;\r
3545                                 if( !int.TryParse( this.textBoxGLEVEL.Text, out n値 ) )\r
3546                                 {\r
3547                                         n値 = 0;\r
3548                                 }\r
3549                                 else if( n値 < 0 )\r
3550                                 {\r
3551                                         n値 = 0;\r
3552                                 }\r
3553                                 else if( n値 > 100 )\r
3554                                 {\r
3555                                         n値 = 100;\r
3556                                 }\r
3557 \r
3558 \r
3559                                 // 値を水平スクロールバーにも反映。\r
3560 \r
3561                                 if( this.hScrollBarGLEVEL.Value != n値 )\r
3562                                 {\r
3563                                         this.t次のプロパティ変更処理がUndoRedoリストに載るようにする();\r
3564                                         this.hScrollBarGLEVEL.Value = n値;             // ここで hScrollBarGLEVEL_ValueChanged が発動 → UndoRedo処理はそちらで。\r
3565                                 }\r
3566                         }\r
3567                 }\r
3568                 private void hScrollBarGLEVEL_ValueChanged( object sender, EventArgs e )\r
3569                 {\r
3570                         // 値をテキストボックスにも反映。\r
3571 \r
3572                         this.textBoxGLEVEL.Text = this.hScrollBarGLEVEL.Value.ToString();\r
3573 \r
3574                         // Undo/Redo リストを修正。\r
3575 \r
3576                         #region [ Undo/Redo リストを修正する。]\r
3577                         //-----------------\r
3578                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
3579                         {\r
3580                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3581 \r
3582                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.hScrollBarGLEVEL ) )\r
3583                                 {\r
3584                                         // 既存のセルの値を更新。\r
3585 \r
3586                                         ( (CUndoRedoセル<int>) oセル仮想 ).変更後の値 = this.hScrollBarGLEVEL.Value;\r
3587                                 }\r
3588                                 else\r
3589                                 {\r
3590                                         // 新しいセルを追加。\r
3591 \r
3592                                         this.mgrUndoRedo管理者.tノードを追加する(\r
3593                                                 new CUndoRedoセル<int>(\r
3594                                                         this.hScrollBarGLEVEL,\r
3595                                                         new DGUndoを実行する<int>( this.nGLEVEL_Undo ),\r
3596                                                         new DGRedoを実行する<int>( this.nGLEVEL_Redo ),\r
3597                                                         this.nGLEVEL_以前の値, this.hScrollBarGLEVEL.Value ) );\r
3598 \r
3599 \r
3600                                         // Undo ボタンを有効にする。\r
3601                                         \r
3602                                         this.tUndoRedo用GUIの有効無効を設定する();\r
3603                                 }\r
3604                         }\r
3605                         //-----------------\r
3606                         #endregion\r
3607 \r
3608 \r
3609                         // Undo 用に値を保管しておく。\r
3610 \r
3611                         this.nGLEVEL_以前の値 = this.hScrollBarGLEVEL.Value;\r
3612                         \r
3613                         \r
3614                         // 完了。\r
3615 \r
3616                         CUndoRedo管理.bUndoRedoした直後 = false;\r
3617                         this.b未保存 = true;\r
3618                 }\r
3619                 private void nGLEVEL_Undo( int n変更前, int n変更後 )\r
3620                 {\r
3621                         // 変更前の値に戻す。\r
3622 \r
3623                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3624 \r
3625                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3626                         this.textBoxGLEVEL.Text = n変更前.ToString();\r
3627 \r
3628                         this.textBoxGLEVEL.Focus();\r
3629 \r
3630 \r
3631                         // 値を水平スクロールバーにも反映する。\r
3632 \r
3633                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3634                         this.hScrollBarGLEVEL.Value = n変更前;\r
3635                 }\r
3636                 private void nGLEVEL_Redo( int n変更前, int n変更後 )\r
3637                 {\r
3638                         // 変更後の値に戻す。\r
3639 \r
3640                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3641 \r
3642                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3643                         this.textBoxGLEVEL.Text = n変更後.ToString();\r
3644 \r
3645                         this.textBoxGLEVEL.Focus();\r
3646 \r
3647                         \r
3648                         // 値を水平スクロールバーにも反映する。\r
3649 \r
3650                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3651                         this.hScrollBarGLEVEL.Value = n変更後;\r
3652                 }\r
3653                 #endregion\r
3654                 #region [ BLEVEL ]\r
3655                 private int nBLEVEL_以前の値;\r
3656                 private void textBoxBLEVEL_TextChanged( object sender, EventArgs e )\r
3657                 {\r
3658                         // 何もしない。→ 数字以外が入力されていることもあるため、Leaveまで待つ。\r
3659                 }\r
3660                 private void textBoxBLEVEL_Leave( object sender, EventArgs e )\r
3661                 {\r
3662                         if( this.textBoxBLEVEL.Text.Length > 0 )\r
3663                         {\r
3664                                 // 数値チェック。\r
3665 \r
3666                                 int n値;\r
3667                                 if( !int.TryParse( this.textBoxBLEVEL.Text, out n値 ) )\r
3668                                 {\r
3669                                         n値 = 0;\r
3670                                 }\r
3671                                 else if( n値 < 0 )\r
3672                                 {\r
3673                                         n値 = 0;\r
3674                                 }\r
3675                                 else if( n値 > 100 )\r
3676                                 {\r
3677                                         n値 = 100;\r
3678                                 }\r
3679 \r
3680 \r
3681                                 // 値を水平スクロールバーにも反映。\r
3682 \r
3683                                 if( this.hScrollBarBLEVEL.Value != n値 )\r
3684                                 {\r
3685                                         this.t次のプロパティ変更処理がUndoRedoリストに載るようにする();\r
3686                                         this.hScrollBarBLEVEL.Value = n値;             // ここで hScrollBarBLEVEL_ValueChanged が発動 → UndoRedo処理はそちらで。\r
3687                                 }\r
3688                         }\r
3689                 }\r
3690                 private void hScrollBarBLEVEL_ValueChanged( object sender, EventArgs e )\r
3691                 {\r
3692                         // 値をテキストボックスにも反映。\r
3693 \r
3694                         this.textBoxBLEVEL.Text = this.hScrollBarBLEVEL.Value.ToString();\r
3695 \r
3696 \r
3697                         // Undo/Redo リストを修正。\r
3698 \r
3699                         #region [ Undo/Redo リストを修正する。]\r
3700                         //-----------------\r
3701                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
3702                         {\r
3703                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3704 \r
3705                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.hScrollBarBLEVEL ) )\r
3706                                 {\r
3707                                         // 既存のセルの値を更新。\r
3708                                         \r
3709                                         ( (CUndoRedoセル<int>) oセル仮想 ).変更後の値 = this.hScrollBarBLEVEL.Value;\r
3710                                 }\r
3711                                 else\r
3712                                 {\r
3713                                         // 新しいセルを追加。\r
3714 \r
3715                                         this.mgrUndoRedo管理者.tノードを追加する( \r
3716                                                 new CUndoRedoセル<int>(\r
3717                                                         this.hScrollBarBLEVEL,\r
3718                                                         new DGUndoを実行する<int>( this.nBLEVEL_Undo ),\r
3719                                                         new DGRedoを実行する<int>( this.nBLEVEL_Redo ),\r
3720                                                         this.nBLEVEL_以前の値, this.hScrollBarBLEVEL.Value ) );\r
3721 \r
3722                 \r
3723                                         // Undo ボタンを有効にする。\r
3724 \r
3725                                         this.tUndoRedo用GUIの有効無効を設定する();\r
3726                                 }\r
3727                         }\r
3728                         //-----------------\r
3729                         #endregion\r
3730 \r
3731                         \r
3732                         // Undo 用に値を保管しておく。\r
3733 \r
3734                         this.nBLEVEL_以前の値 = this.hScrollBarBLEVEL.Value;\r
3735 \r
3736 \r
3737                         // 完了。\r
3738 \r
3739                         CUndoRedo管理.bUndoRedoした直後 = false;\r
3740                         this.b未保存 = true;\r
3741                 }\r
3742                 private void nBLEVEL_Undo( int n変更前, int n変更後 )\r
3743                 {\r
3744                         // 変更前の値に戻す。\r
3745 \r
3746                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3747 \r
3748                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3749                         this.textBoxBLEVEL.Text = n変更前.ToString();\r
3750 \r
3751                         this.textBoxBLEVEL.Focus();\r
3752 \r
3753 \r
3754                         // 値を水平スクロールバーにも反映。\r
3755 \r
3756                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3757                         this.hScrollBarBLEVEL.Value = n変更前;\r
3758                 }\r
3759                 private void nBLEVEL_Redo( int n変更前, int n変更後 )\r
3760                 {\r
3761                         // 変更後の値に戻す。\r
3762 \r
3763                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3764 \r
3765                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3766                         this.textBoxBLEVEL.Text = n変更後.ToString();\r
3767 \r
3768                         this.textBoxBLEVEL.Focus();\r
3769 \r
3770 \r
3771                         // 値を水平スクロールバーにも反映。\r
3772 \r
3773                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3774                         this.hScrollBarBLEVEL.Value = n変更後;\r
3775                 }\r
3776                 #endregion\r
3777 \r
3778                 #region [ PANEL ]\r
3779                 private string textBoxパネル_以前の値 = "";\r
3780                 private void textBoxパネル_TextChanged( object sender, EventArgs e )\r
3781                 {\r
3782                         // Undo/Redo リストを修正。\r
3783 \r
3784                         #region [ Undo/Redo リストを修正する。]\r
3785                         //-----------------\r
3786                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
3787                         {\r
3788                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3789 \r
3790                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxパネル ) )\r
3791                                 {\r
3792                                         // 既存のセルの値を更新。\r
3793 \r
3794                                         ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxパネル.Text;\r
3795                                 }\r
3796                                 else\r
3797                                 {\r
3798                                         // 新しいセルを追加。\r
3799 \r
3800                                         this.mgrUndoRedo管理者.tノードを追加する(\r
3801                                                 new CUndoRedoセル<string>(\r
3802                                                         this.textBoxパネル, \r
3803                                                         new DGUndoを実行する<string>( this.textBoxパネル_Undo ),\r
3804                                                         new DGRedoを実行する<string>( this.textBoxパネル_Redo ), \r
3805                                                         this.textBoxパネル_以前の値, this.textBoxパネル.Text ) );\r
3806 \r
3807 \r
3808                                         // Undoボタンを有効にする。\r
3809 \r
3810                                         this.tUndoRedo用GUIの有効無効を設定する();\r
3811                                 }\r
3812                         }\r
3813                         //-----------------\r
3814                         #endregion\r
3815 \r
3816 \r
3817                         // Undo 用に値を保管しておく。\r
3818 \r
3819                         this.textBoxパネル_以前の値 = this.textBoxパネル.Text;\r
3820 \r
3821 \r
3822                         // 完了。\r
3823 \r
3824                         CUndoRedo管理.bUndoRedoした直後 = false;\r
3825                         this.b未保存 = true;\r
3826                 }\r
3827                 private void textBoxパネル_Leave( object sender, EventArgs e )\r
3828                 {\r
3829                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3830 \r
3831                         if( oセル仮想 != null )\r
3832                                 oセル仮想.t所有権の放棄( this.textBoxパネル );\r
3833                 }\r
3834                 private void textBoxパネル_Undo( string str変更前, string str変更後 )\r
3835                 {\r
3836                         // 変更前の値に戻す。\r
3837 \r
3838                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3839 \r
3840                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3841                         this.textBoxパネル.Text = str変更前;\r
3842 \r
3843                         this.textBoxパネル.Focus();\r
3844                 }\r
3845                 private void textBoxパネル_Redo( string str変更前, string str変更後 )\r
3846                 {\r
3847                         // 変更後の値に戻す。\r
3848 \r
3849                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3850 \r
3851                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3852                         this.textBoxパネル.Text = str変更後;\r
3853 \r
3854                         this.textBoxパネル.Focus();\r
3855                 }\r
3856                 #endregion\r
3857                 #region [ PREVIEW ]\r
3858                 private string textBoxPREVIEW_以前の値 = "";\r
3859                 private void textBoxPREVIEW_TextChanged( object sender, EventArgs e )\r
3860                 {\r
3861                         // Undo/Redo リストを修正。\r
3862 \r
3863                         #region [ Undo/Redo リストを修正する。]\r
3864                         //-----------------\r
3865                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
3866                         {\r
3867                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3868 \r
3869                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxPREVIEW ) )\r
3870                                 {\r
3871                                         // 既存のセルの値を更新。\r
3872 \r
3873                                         ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxPREVIEW.Text;\r
3874                                 }\r
3875                                 else\r
3876                                 {\r
3877                                         // 新しいセルを追加。\r
3878 \r
3879                                         this.mgrUndoRedo管理者.tノードを追加する( \r
3880                                                 new CUndoRedoセル<string>(\r
3881                                                         this.textBoxPREVIEW,\r
3882                                                         new DGUndoを実行する<string>( this.textBoxPREVIEW_Undo ),\r
3883                                                         new DGRedoを実行する<string>( this.textBoxPREVIEW_Redo ), \r
3884                                                         this.textBoxPREVIEW_以前の値, this.textBoxPREVIEW.Text ) );\r
3885 \r
3886                                         \r
3887                                         // Undo ボタンを有効にする。\r
3888 \r
3889                                         this.tUndoRedo用GUIの有効無効を設定する();\r
3890                                 }\r
3891                         }\r
3892                         //-----------------\r
3893                         #endregion\r
3894 \r
3895 \r
3896                         // Undo 用に値を保管しておく。\r
3897 \r
3898                         this.textBoxPREVIEW_以前の値 = this.textBoxPREVIEW.Text;\r
3899 \r
3900 \r
3901                         // 完了。\r
3902 \r
3903                         CUndoRedo管理.bUndoRedoした直後 = false;\r
3904                         this.b未保存 = true;\r
3905                 }\r
3906                 private void textBoxPREVIEW_Leave( object sender, EventArgs e )\r
3907                 {\r
3908                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3909 \r
3910                         if( oセル仮想 != null )\r
3911                                 oセル仮想.t所有権の放棄( this.textBoxPREVIEW );\r
3912                 }\r
3913                 private void textBoxPREVIEW_Undo( string str変更前, string str変更後 )\r
3914                 {\r
3915                         // 変更前の値に戻す。\r
3916 \r
3917                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3918 \r
3919                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3920                         this.textBoxPREVIEW.Text = str変更前;\r
3921 \r
3922                         this.textBoxPREVIEW.Focus();\r
3923                 }\r
3924                 private void textBoxPREVIEW_Redo( string str変更前, string str変更後 )\r
3925                 {\r
3926                         // 変更前の値に戻す。\r
3927 \r
3928                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3929 \r
3930                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3931                         this.textBoxPREVIEW.Text = str変更後;\r
3932 \r
3933                         this.textBoxPREVIEW.Focus();\r
3934                 }\r
3935                 #endregion\r
3936                 #region [ PREIMAGE ]\r
3937                 private string textBoxPREIMAGE_以前の値 = "";\r
3938                 private void textBoxPREIMAGE_TextChanged( object sender, EventArgs e )\r
3939                 {\r
3940                         // Undo/Redo リストを修正。\r
3941 \r
3942                         #region [ Undo/Redo リストを修正する。]\r
3943                         //-----------------\r
3944                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
3945                         {\r
3946                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3947 \r
3948                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxPREIMAGE ) )\r
3949                                 {\r
3950                                         // 既存のセルの値を更新。\r
3951 \r
3952                                         ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxPREIMAGE.Text;\r
3953                                 }\r
3954                                 else\r
3955                                 {\r
3956                                         // 新規のセルを作成。\r
3957 \r
3958                                         this.mgrUndoRedo管理者.tノードを追加する( \r
3959                                                 new CUndoRedoセル<string>( \r
3960                                                         this.textBoxPREIMAGE, \r
3961                                                         new DGUndoを実行する<string>( this.textBoxPREIMAGE_Undo ), \r
3962                                                         new DGRedoを実行する<string>( this.textBoxPREIMAGE_Redo ), \r
3963                                                         this.textBoxPREIMAGE_以前の値, this.textBoxPREIMAGE.Text ) );\r
3964 \r
3965 \r
3966                                         // Undo ボタンを有効にする。\r
3967 \r
3968                                         this.tUndoRedo用GUIの有効無効を設定する();\r
3969                                 }\r
3970                         }\r
3971                         //-----------------\r
3972                         #endregion\r
3973 \r
3974 \r
3975                         // Undo用に値を保管しておく。]\r
3976 \r
3977                         this.textBoxPREIMAGE_以前の値 = this.textBoxPREIMAGE.Text;\r
3978                         \r
3979                         \r
3980                         // 完了。\r
3981 \r
3982                         CUndoRedo管理.bUndoRedoした直後 = false;\r
3983                         this.b未保存 = true;\r
3984                 }\r
3985                 private void textBoxPREIMAGE_Leave( object sender, EventArgs e )\r
3986                 {\r
3987                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
3988 \r
3989                         if( oセル仮想 != null )\r
3990                                 oセル仮想.t所有権の放棄( this.textBoxPREIMAGE );\r
3991                 }\r
3992                 private void textBoxPREIMAGE_Undo( string str変更前, string str変更後 )\r
3993                 {\r
3994                         // 変更前の値に戻す。\r
3995 \r
3996                         this.tタブを選択する( Eタブ種別.基本情報 );\r
3997 \r
3998                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
3999                         this.textBoxPREIMAGE.Text = str変更前;\r
4000 \r
4001                         this.textBoxPREIMAGE.Focus();\r
4002                 }\r
4003                 private void textBoxPREIMAGE_Redo( string str変更前, string str変更後 )\r
4004                 {\r
4005                         // 変更後の値に戻す。\r
4006 \r
4007                         this.tタブを選択する( Eタブ種別.基本情報 );\r
4008 \r
4009                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
4010                         this.textBoxPREIMAGE.Text = str変更後;\r
4011 \r
4012                         this.textBoxPREIMAGE.Focus();\r
4013                 }\r
4014                 #endregion\r
4015                 #region [ STAGEFILE ]\r
4016                 private string textBoxSTAGEFILE_以前の値 = "";\r
4017                 private void textBoxSTAGEFILE_TextChanged( object sender, EventArgs e )\r
4018                 {\r
4019                         // Undo/Redo リストを修正。\r
4020 \r
4021                         #region [ Undo/Redo リストを修正する。]\r
4022                         //-----------------\r
4023                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
4024                         {\r
4025                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
4026 \r
4027                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxSTAGEFILE ) )\r
4028                                 {\r
4029                                         // 既存のセルの値を更新。\r
4030 \r
4031                                         ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxSTAGEFILE.Text;\r
4032                                 }\r
4033                                 else\r
4034                                 {\r
4035                                         // 新しいセルを追加。\r
4036 \r
4037                                         this.mgrUndoRedo管理者.tノードを追加する( \r
4038                                                 new CUndoRedoセル<string>(\r
4039                                                         this.textBoxSTAGEFILE,\r
4040                                                         new DGUndoを実行する<string>( this.textBoxSTAGEFILE_Undo ),\r
4041                                                         new DGRedoを実行する<string>( this.textBoxSTAGEFILE_Redo ), \r
4042                                                         this.textBoxSTAGEFILE_以前の値, this.textBoxSTAGEFILE.Text ) );\r
4043 \r
4044 \r
4045                                         // Undo ボタンを有効にする。\r
4046 \r
4047                                         this.tUndoRedo用GUIの有効無効を設定する();\r
4048                                 }\r
4049                         }\r
4050                         //-----------------\r
4051                         #endregion\r
4052 \r
4053 \r
4054                         // Undo 用に値を保管しておく。\r
4055 \r
4056                         this.textBoxSTAGEFILE_以前の値 = this.textBoxSTAGEFILE.Text;\r
4057 \r
4058 \r
4059                         // 完了。\r
4060 \r
4061                         CUndoRedo管理.bUndoRedoした直後 = false;\r
4062                         this.b未保存 = true;\r
4063                 }\r
4064                 private void textBoxSTAGEFILE_Leave( object sender, EventArgs e )\r
4065                 {\r
4066                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
4067 \r
4068                         if( oセル仮想 != null )\r
4069                                 oセル仮想.t所有権の放棄( this.textBoxSTAGEFILE );\r
4070                 }\r
4071                 private void textBoxSTAGEFILE_Undo( string str変更前, string str変更後 )\r
4072                 {\r
4073                         // 変更前の値に戻す。\r
4074 \r
4075                         this.tタブを選択する( Eタブ種別.基本情報 );\r
4076 \r
4077                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
4078                         this.textBoxSTAGEFILE.Text = str変更前;\r
4079 \r
4080                         this.textBoxSTAGEFILE.Focus();\r
4081                 }\r
4082                 private void textBoxSTAGEFILE_Redo( string str変更前, string str変更後 )\r
4083                 {\r
4084                         // 変更後の値に戻す。\r
4085 \r
4086                         this.tタブを選択する( Eタブ種別.基本情報 );\r
4087 \r
4088                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
4089                         this.textBoxSTAGEFILE.Text = str変更後;\r
4090 \r
4091                         this.textBoxSTAGEFILE.Focus();\r
4092                 }\r
4093                 #endregion\r
4094                 #region [ BACKGROUND ]\r
4095                 private string textBoxBACKGROUND_以前の値 = "";\r
4096                 private void textBoxBACKGROUND_TextChanged( object sender, EventArgs e )\r
4097                 {\r
4098                         // Undo/Redo リストを修正。\r
4099 \r
4100                         #region [ Undo/Redo リストを修正する。]\r
4101                         //-----------------\r
4102                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
4103                         {\r
4104                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
4105 \r
4106                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxBACKGROUND ) )\r
4107                                 {\r
4108                                         // 既存のセルの値を更新。\r
4109 \r
4110                                         ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxBACKGROUND.Text;\r
4111                                 }\r
4112                                 else\r
4113                                 {\r
4114                                         // 新しいセルを追加。\r
4115 \r
4116                                         this.mgrUndoRedo管理者.tノードを追加する( \r
4117                                                 new CUndoRedoセル<string>(\r
4118                                                         this.textBoxBACKGROUND,\r
4119                                                         new DGUndoを実行する<string>( this.textBoxBACKGROUND_Undo ),\r
4120                                                         new DGRedoを実行する<string>( this.textBoxBACKGROUND_Redo ), \r
4121                                                         this.textBoxBACKGROUND_以前の値, this.textBoxBACKGROUND.Text ) );\r
4122 \r
4123 \r
4124                                         // Undo ボタンを有効にする。\r
4125 \r
4126                                         this.tUndoRedo用GUIの有効無効を設定する();\r
4127                                 }\r
4128                         }\r
4129                         //-----------------\r
4130                         #endregion\r
4131 \r
4132 \r
4133                         // Undo 用の値を保管しておく。\r
4134 \r
4135                         this.textBoxBACKGROUND_以前の値 = this.textBoxBACKGROUND.Text;\r
4136 \r
4137 \r
4138                         // 完了。\r
4139 \r
4140                         CUndoRedo管理.bUndoRedoした直後 = false;\r
4141                         this.b未保存 = true;\r
4142                 }\r
4143                 private void textBoxBACKGROUND_Leave( object sender, EventArgs e )\r
4144                 {\r
4145                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
4146 \r
4147                         if( oセル仮想 != null )\r
4148                                 oセル仮想.t所有権の放棄( this.textBoxBACKGROUND );\r
4149                 }\r
4150                 private void textBoxBACKGROUND_Undo( string str変更前, string str変更後 )\r
4151                 {\r
4152                         // 変更前の値に戻す。\r
4153 \r
4154                         this.tタブを選択する( Eタブ種別.基本情報 );\r
4155 \r
4156                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
4157                         this.textBoxBACKGROUND.Text = str変更前;\r
4158 \r
4159                         this.textBoxBACKGROUND.Focus();\r
4160                 }\r
4161                 private void textBoxBACKGROUND_Redo( string str変更前, string str変更後 )\r
4162                 {\r
4163                         // 変更後の値に戻す。\r
4164 \r
4165                         this.tタブを選択する( Eタブ種別.基本情報 );\r
4166 \r
4167                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
4168                         this.textBoxBACKGROUND.Text = str変更後;\r
4169 \r
4170                         this.textBoxBACKGROUND.Focus();\r
4171                 }\r
4172                 #endregion\r
4173                 #region [ RESULTIMAGE ]\r
4174                 private string textBoxRESULTIMAGE_以前の値 = "";\r
4175                 private void textBoxRESULTIMAGE_TextChanged( object sender, EventArgs e )\r
4176                 {\r
4177                         // Undo/Redo リストを修正。\r
4178 \r
4179                         #region [ Undo/Redo リストを修正する。]\r
4180                         //-----------------\r
4181                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
4182                         {\r
4183                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
4184 \r
4185                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBoxRESULTIMAGE ) )\r
4186                                 {\r
4187                                         // 既存のセルの値を更新。\r
4188 \r
4189                                         ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBoxRESULTIMAGE.Text;\r
4190                                 }\r
4191                                 else\r
4192                                 {\r
4193                                         // 新しいセルを追加。\r
4194 \r
4195                                         this.mgrUndoRedo管理者.tノードを追加する( \r
4196                                                 new CUndoRedoセル<string>(\r
4197                                                         this.textBoxRESULTIMAGE,\r
4198                                                         new DGUndoを実行する<string>( this.textBoxRESULTIMAGE_Undo ),\r
4199                                                         new DGRedoを実行する<string>( this.textBoxRESULTIMAGE_Redo ), \r
4200                                                         this.textBoxRESULTIMAGE_以前の値, this.textBoxRESULTIMAGE.Text ) );\r
4201 \r
4202 \r
4203                                         // Undo ボタンを有効にする。\r
4204 \r
4205                                         this.tUndoRedo用GUIの有効無効を設定する();\r
4206                                 }\r
4207                         }\r
4208                         //-----------------\r
4209                         #endregion\r
4210 \r
4211 \r
4212                         // Undo 用に値を保管しておく。\r
4213 \r
4214                         this.textBoxRESULTIMAGE_以前の値 = this.textBoxRESULTIMAGE.Text;\r
4215 \r
4216 \r
4217                         // 完了。\r
4218 \r
4219                         CUndoRedo管理.bUndoRedoした直後 = false;\r
4220                         this.b未保存 = true;\r
4221                 }\r
4222                 private void textBoxRESULTIMAGE_Leave( object sender, EventArgs e )\r
4223                 {\r
4224                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
4225                 \r
4226                         if( oセル仮想 != null )\r
4227                                 oセル仮想.t所有権の放棄( this.textBoxRESULTIMAGE );\r
4228                 }\r
4229                 private void textBoxRESULTIMAGE_Undo( string str変更前, string str変更後 )\r
4230                 {\r
4231                         // 変更前の値に戻す。\r
4232 \r
4233                         this.tタブを選択する( Eタブ種別.基本情報 );\r
4234 \r
4235                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
4236                         this.textBoxRESULTIMAGE.Text = str変更前;\r
4237 \r
4238                         this.textBoxRESULTIMAGE.Focus();\r
4239                 }\r
4240                 private void textBoxRESULTIMAGE_Redo( string str変更前, string str変更後 )\r
4241                 {\r
4242                         // 変更後の値に戻す。\r
4243 \r
4244                         this.tタブを選択する( Eタブ種別.基本情報 );\r
4245 \r
4246                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
4247                         this.textBoxRESULTIMAGE.Text = str変更後;\r
4248 \r
4249                         this.textBoxRESULTIMAGE.Focus();\r
4250                 }\r
4251                 #endregion\r
4252 \r
4253                 #region [ PREVIEW参照ボタン ]\r
4254                 private void buttonPREVIEW参照_Click( object sender, EventArgs e )\r
4255                 {\r
4256                         string str初期フォルダ名 = this.str作業フォルダ名;\r
4257 \r
4258                         if( this.textBoxPREVIEW.Text.Length > 0 )\r
4259                                 str初期フォルダ名 = this.strファイルの存在するディレクトリを絶対パスで返す( this.textBoxPREVIEW.Text );\r
4260 \r
4261                         string strファイル名 = this.tファイル選択ダイアログでファイルを選択し相対パスにして返す(\r
4262                                 Resources.strプレビュー音ファイル選択ダイアログのタイトル, \r
4263                                 Resources.strサウンドファイル選択ダイアログのフィルタ, \r
4264                                 str初期フォルダ名 );\r
4265 \r
4266                         if( strファイル名.Length > 0 )\r
4267                         {\r
4268                                 this.textBoxPREVIEW.Text = strファイル名;\r
4269                                 this.b未保存 = true;\r
4270                         }\r
4271                 }\r
4272                 #endregion\r
4273                 #region [ PREIMAGE参照ボタン ]\r
4274                 private void buttonPREIMAGE参照_Click( object sender, EventArgs e )\r
4275                 {\r
4276                         string str初期フォルダ名 = this.str作業フォルダ名;\r
4277 \r
4278                         if( this.textBoxPREIMAGE.Text.Length > 0 )\r
4279                                 str初期フォルダ名 = this.strファイルの存在するディレクトリを絶対パスで返す( this.textBoxPREIMAGE.Text );\r
4280 \r
4281                         string strファイル名 = this.tファイル選択ダイアログでファイルを選択し相対パスにして返す(\r
4282                                 Resources.strプレビュー画像ファイル選択ダイアログのタイトル, \r
4283                                 Resources.str画像ファイル選択ダイアログのフィルタ,\r
4284                                 str初期フォルダ名 );\r
4285                         \r
4286                         if( strファイル名.Length > 0 )\r
4287                         {\r
4288                                 this.textBoxPREIMAGE.Text = strファイル名;\r
4289                                 this.b未保存 = true;\r
4290                         }\r
4291                 }\r
4292                 #endregion\r
4293                 #region [ STAGEFILE参照ボタン ]\r
4294                 private void buttonSTAGEFILE参照_Click( object sender, EventArgs e )\r
4295                 {\r
4296                         string str初期フォルダ名 = this.str作業フォルダ名;\r
4297 \r
4298                         if( this.textBoxSTAGEFILE.Text.Length > 0 )\r
4299                                 str初期フォルダ名 = this.strファイルの存在するディレクトリを絶対パスで返す( this.textBoxSTAGEFILE.Text );\r
4300 \r
4301                         string strファイル名 = this.tファイル選択ダイアログでファイルを選択し相対パスにして返す(\r
4302                                 Resources.strステージ画像ファイル選択ダイアログのタイトル,\r
4303                                 Resources.str画像ファイル選択ダイアログのフィルタ, \r
4304                                 str初期フォルダ名 );\r
4305 \r
4306                         if( strファイル名.Length > 0 )\r
4307                         {\r
4308                                 this.textBoxSTAGEFILE.Text = strファイル名;\r
4309                                 this.b未保存 = true;\r
4310                         }\r
4311                 }\r
4312                 #endregion\r
4313                 #region [ BACKGROUND参照ボタン ]\r
4314                 private void buttonBACKGROUND参照_Click( object sender, EventArgs e )\r
4315                 {\r
4316                         string str初期フォルダ名 = this.str作業フォルダ名;\r
4317 \r
4318                         if( this.textBoxBACKGROUND.Text.Length > 0 )\r
4319                                 str初期フォルダ名 = this.strファイルの存在するディレクトリを絶対パスで返す( this.textBoxBACKGROUND.Text );\r
4320 \r
4321                         string strファイル名 = this.tファイル選択ダイアログでファイルを選択し相対パスにして返す(\r
4322                                 Resources.str背景画像ファイル選択ダイアログのタイトル, \r
4323                                 Resources.str画像ファイル選択ダイアログのフィルタ, \r
4324                                 str初期フォルダ名 );\r
4325 \r
4326                         if( strファイル名.Length > 0 )\r
4327                         {\r
4328                                 this.textBoxBACKGROUND.Text = strファイル名;\r
4329                                 this.b未保存 = true;\r
4330                         }\r
4331                 }\r
4332                 #endregion\r
4333                 #region [ RESULTIMAGE参照ボタン ]\r
4334                 private void buttonRESULTIMAGE参照_Click( object sender, EventArgs e )\r
4335                 {\r
4336                         string str初期フォルダ名 = this.str作業フォルダ名;\r
4337                         \r
4338                         if( this.textBoxRESULTIMAGE.Text.Length > 0 )\r
4339                                 str初期フォルダ名 = this.strファイルの存在するディレクトリを絶対パスで返す( this.textBoxRESULTIMAGE.Text );\r
4340 \r
4341                         string strファイル名 = this.tファイル選択ダイアログでファイルを選択し相対パスにして返す(\r
4342                                 Resources.str結果画像ファイル選択ダイアログのタイトル,\r
4343                                 Resources.str画像ファイル選択ダイアログのフィルタ, \r
4344                                 str初期フォルダ名 );\r
4345 \r
4346                         if( strファイル名.Length > 0 )\r
4347                         {\r
4348                                 this.textBoxRESULTIMAGE.Text = strファイル名;\r
4349                                 this.b未保存 = true;\r
4350                         }\r
4351                 }\r
4352                 #endregion\r
4353                 #region [ Use 556 x 710 BGA/AVI ]\r
4354                 private bool check556x710BGAAVI_以前の値 = false;\r
4355                 private void check556x710BGAAVI_CheckedChanged(object sender, EventArgs e)\r
4356                 {\r
4357                         // Undo/Redo リストを修正する。\r
4358 \r
4359                         #region [ Undo/Redo リストを修正。]\r
4360                         //-----------------\r
4361                         if (!CUndoRedo管理.bUndoRedoした直後)\r
4362                         {\r
4363                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
4364 \r
4365                                 if ((oセル仮想 != null) && oセル仮想.b所有権がある(this.check556x710BGAAVI))\r
4366                                 {\r
4367                                         // 既存のセルの値を更新。\r
4368 \r
4369                                         ((CUndoRedoセル<bool>)oセル仮想).変更後の値 = this.check556x710BGAAVI.Checked;\r
4370                                 }\r
4371                                 else\r
4372                                 {\r
4373                                         // 新しいセルを追加。\r
4374 \r
4375                                         this.mgrUndoRedo管理者.tノードを追加する(\r
4376                                                 new CUndoRedoセル<bool>(\r
4377                                                         this.check556x710BGAAVI.Checked,\r
4378                                                         new DGUndoを実行する<bool>(this.check556x710BGAAVI_Undo),\r
4379                                                         new DGRedoを実行する<bool>(this.check556x710BGAAVI_Redo),\r
4380                                                         this.check556x710BGAAVI_以前の値, this.check556x710BGAAVI.Checked));\r
4381 \r
4382                                         // Undo ボタンを有効にする。\r
4383 \r
4384                                         this.tUndoRedo用GUIの有効無効を設定する();\r
4385                                 }\r
4386                         }\r
4387                         //-----------------\r
4388                         #endregion\r
4389 \r
4390 \r
4391                         // Undo 用に値を保管しておく。\r
4392 \r
4393                         this.check556x710BGAAVI_以前の値 = this.check556x710BGAAVI.Checked;\r
4394                         \r
4395 \r
4396                         // 完了。\r
4397 \r
4398                         CUndoRedo管理.bUndoRedoした直後 = false;\r
4399                         this.b未保存 = true;\r
4400                 }\r
4401                 private void check556x710BGAAVI_Leave(object sender, EventArgs e)\r
4402                 {\r
4403                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
4404 \r
4405                         if (oセル仮想 != null)\r
4406                                 oセル仮想.t所有権の放棄(this.check556x710BGAAVI);\r
4407                 }\r
4408                 private void check556x710BGAAVI_Undo(bool b変更前, bool b変更後)\r
4409                 {\r
4410                         // 変更前の値に戻す。\r
4411 \r
4412                         this.tタブを選択する(Eタブ種別.基本情報);\r
4413 \r
4414                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
4415                         this.check556x710BGAAVI.Checked = b変更前;\r
4416 \r
4417                         this.check556x710BGAAVI.Focus();\r
4418                 }\r
4419                 private void check556x710BGAAVI_Redo(bool b変更前, bool b変更後)\r
4420                 {\r
4421                         // 変更後の値に戻す。\r
4422 \r
4423                         this.tタブを選択する(Eタブ種別.基本情報);\r
4424 \r
4425                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
4426                         this.check556x710BGAAVI.Checked = b変更後;\r
4427 \r
4428                         this.check556x710BGAAVI.Focus();\r
4429                 }\r
4430                 #endregion\r
4431                 //-----------------\r
4432                 #endregion\r
4433                 #region [ GUIイベント:WAVリスト関連 ]\r
4434                 //-----------------\r
4435                 private void listViewWAVリスト_Click( object sender, EventArgs e )\r
4436                 {\r
4437                         #region [ プレビュー音を再生する。]\r
4438                         //-----------------\r
4439                         if( this.listViewWAVリスト.SelectedIndices.Count > 0 && this.toolStripButtonWAVリストプレビュースイッチ.Checked )\r
4440                         {\r
4441                                 ListViewItem item = this.listViewWAVリスト.Items[ this.listViewWAVリスト.SelectedIndices[ 0 ] ];\r
4442                                 this.mgrWAVリスト管理者.tプレビュー音を再生する( C変換.n36進数2桁の文字列を数値に変換して返す( item.SubItems[ 1 ].Text ) );\r
4443                         }\r
4444                         //-----------------\r
4445                         #endregion\r
4446                 }\r
4447                 private void listViewWAVリスト_DoubleClick( object sender, EventArgs e )\r
4448                 {\r
4449                         #region [ サウンドプロパティを開いて編集する。]\r
4450                         //-----------------\r
4451                         if( this.mgrWAVリスト管理者.n現在選択中のItem番号0to1294 < 0 )\r
4452                                 return;         // 選択されていない\r
4453 \r
4454                         this.mgrWAVリスト管理者.tサウンドプロパティを開いて編集する( this.mgrWAVリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );\r
4455                         //-----------------\r
4456                         #endregion\r
4457                 }\r
4458                 private void listViewWAVリスト_ItemDrag( object sender, ItemDragEventArgs e )\r
4459                 {\r
4460                         #region [ CWAVデータをDragDrop用データに格納し、DoDragDrop()を呼び出す。]\r
4461                         //-----------------\r
4462                         var item = (ListViewItem) e.Item;\r
4463 \r
4464                         var data = new Cチップパレット向けDragDropデータ() {\r
4465                                 n種類 = 0,\r
4466                                 strラベル名 = item.SubItems[ 0 ].Text,\r
4467                                 n番号1to1295 = C変換.n36進数2桁の文字列を数値に変換して返す( item.SubItems[ 1 ].Text ),\r
4468                                 strファイル名 = item.SubItems[ 2 ].Text,\r
4469                                 col文字色 = item.ForeColor,\r
4470                                 col背景色 = item.BackColor,\r
4471                         };\r
4472 \r
4473                         this.DoDragDrop( data, DragDropEffects.Copy );\r
4474 \r
4475                         //-----------------\r
4476                         #endregion\r
4477                 }\r
4478                 private void listViewWAVリスト_KeyPress( object sender, KeyPressEventArgs e )\r
4479                 {\r
4480                         #region [ ENTER が押下されたら、サウンドプロパティを開いて編集する。]\r
4481                         //-----------------\r
4482                         if( e.KeyChar == (char) Keys.Return )\r
4483                         {\r
4484                                 if( this.mgrWAVリスト管理者.n現在選択中のItem番号0to1294 < 0 )\r
4485                                         return;         // 選択されていない\r
4486 \r
4487                                 this.mgrWAVリスト管理者.tサウンドプロパティを開いて編集する( this.mgrWAVリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );\r
4488                         }\r
4489                         //-----------------\r
4490                         #endregion\r
4491                 }\r
4492                 private void listViewWAVリスト_MouseEnter( object sender, EventArgs e )\r
4493                 {\r
4494                         #region [ WAVリストにフォーカスを移動する。]\r
4495                         //-----------------\r
4496                         if( this.appアプリ設定.AutoFocus )\r
4497                                 this.mgrWAVリスト管理者.tWAVリストにフォーカスを当てる();\r
4498                         //-----------------\r
4499                         #endregion\r
4500                 }\r
4501                 private void listViewWAVリスト_RetrieveVirtualItem( object sender, RetrieveVirtualItemEventArgs e )\r
4502                 {\r
4503                         e.Item = this.mgrWAVリスト管理者.tCWAVとListViewItemを生成して返す( e.ItemIndex + 1 );\r
4504                 }\r
4505                 private void listViewWAVリスト_SelectedIndexChanged( object sender, EventArgs e )\r
4506                 {\r
4507                         #region [ WAV, BMP, AVI のカーソルを、選択された行に全部合わせる。]\r
4508                         //-----------------\r
4509                         if( this.listViewWAVリスト.SelectedIndices.Count > 0 )\r
4510                                 this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( this.listViewWAVリスト.SelectedIndices[ 0 ] );\r
4511                         //-----------------\r
4512                         #endregion\r
4513                 }\r
4514 \r
4515                 private void toolStripButtonWAVリストプレビュースイッチ_CheckStateChanged( object sender, EventArgs e )\r
4516                 {\r
4517                         #region [ 再生ボタンと停止ボタンの有効・無効を設定する。]\r
4518                         //-----------------\r
4519                         bool b再生有効 = ( this.toolStripButtonWAVリストプレビュースイッチ.CheckState == CheckState.Checked ) ? true : false;\r
4520                         this.toolStripButtonWAVリストプレビュー再生開始.Enabled = b再生有効;\r
4521                         this.toolStripButtonWAVリストプレビュー再生停止.Enabled = b再生有効;\r
4522                         //-----------------\r
4523                         #endregion\r
4524 \r
4525                         #region [ 無効かつ再生中ならプレビュー音を停止する。]\r
4526                         //-----------------\r
4527                         if( !b再生有効 )\r
4528                                 this.mgrWAVリスト管理者.tプレビュー音を停止する();\r
4529                         //-----------------\r
4530                         #endregion\r
4531                 }\r
4532                 private void toolStripButtonWAVリストプレビュー再生開始_Click( object sender, EventArgs e )\r
4533                 {\r
4534                         #region [ 現在選択中のWAVのプレビュー音を再生する。]\r
4535                         //-----------------\r
4536                         if( this.listViewWAVリスト.SelectedIndices.Count <= 0 )\r
4537                                 return; // 選択されてない\r
4538 \r
4539                         bool b再生有効 = ( this.toolStripButtonWAVリストプレビュースイッチ.CheckState == CheckState.Checked ) ? true : false;\r
4540 \r
4541             if (b再生有効)\r
4542                         {\r
4543                                 int nWAV番号1to1295 = this.mgrWAVリスト管理者.n現在選択中のItem番号0to1294 + 1;\r
4544                                 this.mgrWAVリスト管理者.tプレビュー音を再生する( nWAV番号1to1295 );\r
4545                         }\r
4546                         //-----------------\r
4547                         #endregion\r
4548                 }\r
4549                 private void toolStripButtonWAVリストプレビュー再生停止_Click( object sender, EventArgs e )\r
4550                 {\r
4551                         this.mgrWAVリスト管理者.tプレビュー音を停止する();\r
4552                 }\r
4553                 private void toolStripButtonWAVリスト上移動_Click( object sender, EventArgs e )\r
4554                 {\r
4555                         #region [ 上の行とWAVを交換する。]\r
4556                         //-----------------\r
4557                         if( this.listViewWAVリスト.SelectedIndices.Count <= 0 )\r
4558                                 return; // 選択されていない\r
4559 \r
4560                         int n選択されたItem番号0to1294 = this.listViewWAVリスト.SelectedIndices[ 0 ];\r
4561 \r
4562                         if( n選択されたItem番号0to1294 == 0 )\r
4563                                 return; // 最上行なので無視\r
4564 \r
4565                         this.mgrWAVリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 - 1 );\r
4566                         //-----------------\r
4567                         #endregion\r
4568                 }\r
4569                 private void toolStripButtonWAVリスト下移動_Click( object sender, EventArgs e )\r
4570                 {\r
4571                         if( this.listViewWAVリスト.SelectedIndices.Count <= 0 )\r
4572                                 return; // 選択されていない\r
4573 \r
4574                         int n選択されたItem番号0to1294 = this.listViewWAVリスト.SelectedIndices[ 0 ];\r
4575 \r
4576                         if( n選択されたItem番号0to1294 >= 1294 )\r
4577                                 return; // 最下行なので無視\r
4578 \r
4579                         this.mgrWAVリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 + 1 );\r
4580                 }\r
4581                 //-----------------\r
4582                 #endregion\r
4583                 #region [ GUIイベント:BMPリスト関連 ]\r
4584                 //-----------------\r
4585                 private void listViewBMPリスト_Click( object sender, EventArgs e )\r
4586                 {\r
4587                         // 何もしない\r
4588                 }\r
4589                 private void listViewBMPリスト_DoubleClick( object sender, EventArgs e )\r
4590                 {\r
4591                         #region [ 画像プロパティを開いて編集する。]\r
4592                         //-----------------\r
4593                         if( this.mgrBMPリスト管理者.n現在選択中のItem番号0to1294 < 0 )\r
4594                                 return;         // 選択されていない\r
4595 \r
4596                         this.mgrBMPリスト管理者.t画像プロパティを開いて編集する( this.mgrBMPリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );\r
4597                         //-----------------\r
4598                         #endregion\r
4599                 }\r
4600                 private void listViewBMPリスト_ItemDrag( object sender, ItemDragEventArgs e )\r
4601                 {\r
4602                         #region [ CBMPデータをDragDrop用データに格納し、DoDragDrop()を呼び出す。]\r
4603                         //-----------------\r
4604                         var item = (ListViewItem) e.Item;\r
4605 \r
4606                         var data = new Cチップパレット向けDragDropデータ() {\r
4607                                 n種類 = 1,\r
4608                                 strラベル名 = item.SubItems[ 1 ].Text,\r
4609                                 n番号1to1295 = C変換.n36進数2桁の文字列を数値に変換して返す( item.SubItems[ 2 ].Text ),\r
4610                                 strファイル名 = item.SubItems[ 3 ].Text,\r
4611                                 col文字色 = item.ForeColor,\r
4612                                 col背景色 = item.BackColor,\r
4613                         };\r
4614 \r
4615                         this.DoDragDrop( data, DragDropEffects.Copy );\r
4616                         //-----------------\r
4617                         #endregion\r
4618                 }\r
4619                 private void listViewBMPリスト_KeyPress( object sender, KeyPressEventArgs e )\r
4620                 {\r
4621                         #region [ ENTER が押下されたら、画像プロパティを開いて編集する。]\r
4622                         //-----------------\r
4623                         if( e.KeyChar == (char) Keys.Return )\r
4624                         {\r
4625                                 if( this.mgrBMPリスト管理者.n現在選択中のItem番号0to1294 < 0 )\r
4626                                         return;         // 選択されていない\r
4627 \r
4628                                 this.mgrBMPリスト管理者.t画像プロパティを開いて編集する( this.mgrBMPリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );\r
4629                         }\r
4630                         //-----------------\r
4631                         #endregion\r
4632                 }\r
4633                 private void listViewBMPリスト_MouseEnter( object sender, EventArgs e )\r
4634                 {\r
4635                         #region [ BMPリストにフォーカスを移動する。]\r
4636                         //-----------------\r
4637                         if( this.appアプリ設定.AutoFocus )\r
4638                                 this.mgrBMPリスト管理者.tBMPリストにフォーカスを当てる();\r
4639                         //-----------------\r
4640                         #endregion\r
4641                 }\r
4642                 private void listViewBMPリスト_RetrieveVirtualItem( object sender, RetrieveVirtualItemEventArgs e )\r
4643                 {\r
4644                         e.Item = this.mgrBMPリスト管理者.tCBMPとListViewItemを生成して返す( e.ItemIndex + 1 );\r
4645                 }\r
4646                 private void listViewBMPリスト_SelectedIndexChanged( object sender, EventArgs e )\r
4647                 {\r
4648                         #region [ WAV, BMP, AVI のカーソルを、選択された行に全部合わせる。]\r
4649                         //-----------------\r
4650                         if( this.listViewBMPリスト.SelectedIndices.Count > 0 )\r
4651                                 this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( this.listViewBMPリスト.SelectedIndices[ 0 ] );\r
4652                         //-----------------\r
4653                         #endregion\r
4654                 }\r
4655 \r
4656                 private void toolStripButtonBMPリスト上移動_Click( object sender, EventArgs e )\r
4657                 {\r
4658                         #region [ 上の行とBMPを交換する。]\r
4659                         //-----------------\r
4660                         if( this.listViewBMPリスト.SelectedIndices.Count <= 0 )\r
4661                                 return; // 選択されていない\r
4662 \r
4663                         int n選択されたItem番号0to1294 = this.listViewBMPリスト.SelectedIndices[ 0 ];\r
4664 \r
4665                         if( n選択されたItem番号0to1294 != 0 )\r
4666                                 this.mgrBMPリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 - 1 );\r
4667                         //-----------------\r
4668                         #endregion\r
4669                 }\r
4670                 private void toolStripButtonBMPリスト下移動_Click( object sender, EventArgs e )\r
4671                 {\r
4672                         #region [ 下の行とBMPを交換する。]\r
4673                         //-----------------\r
4674                         if( this.listViewBMPリスト.SelectedIndices.Count <= 0 )\r
4675                                 return; // 選択されていない\r
4676 \r
4677                         int n選択されたItem番号0to1294 = this.listViewBMPリスト.SelectedIndices[ 0 ];\r
4678 \r
4679                         if( n選択されたItem番号0to1294 >= 1294 )\r
4680                                 return; // 最下行なので無視\r
4681 \r
4682                         this.mgrBMPリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 + 1 );\r
4683                         //-----------------\r
4684                         #endregion\r
4685                 }\r
4686                 //-----------------\r
4687                 #endregion\r
4688                 #region [ GUIイベント:AVIリスト関連 ]\r
4689                 //-----------------\r
4690                 private void listViewAVIリスト_Click( object sender, EventArgs e )\r
4691                 {\r
4692                         // 何もしない\r
4693                 }\r
4694                 private void listViewAVIリスト_DoubleClick( object sender, EventArgs e )\r
4695                 {\r
4696                         #region [ 動画プロパティを開いて編集する。]\r
4697                         //-----------------\r
4698                         if( this.mgrAVIリスト管理者.n現在選択中のItem番号0to1294 < 0 )\r
4699                                 return; // 選択されていない\r
4700 \r
4701                         this.mgrAVIリスト管理者.t動画プロパティを開いて編集する( this.mgrAVIリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );\r
4702                         //-----------------\r
4703                         #endregion\r
4704                 }\r
4705                 private void listViewAVIリスト_ItemDrag( object sender, ItemDragEventArgs e )\r
4706                 {\r
4707                         #region [ CAVIデータをDragDrop用データに格納してDoDragDrop()を呼び出す。]\r
4708                         //-----------------\r
4709                         var item = (ListViewItem) e.Item;\r
4710 \r
4711                         var data = new Cチップパレット向けDragDropデータ() {\r
4712                                 n種類 = 2,\r
4713                                 strラベル名 = item.SubItems[ 0 ].Text,\r
4714                                 n番号1to1295 = C変換.n36進数2桁の文字列を数値に変換して返す( item.SubItems[ 1 ].Text ),\r
4715                                 strファイル名 = item.SubItems[ 2 ].Text,\r
4716                                 col文字色 = item.ForeColor,\r
4717                                 col背景色 = item.BackColor,\r
4718                         };\r
4719 \r
4720                         this.DoDragDrop( data, DragDropEffects.Copy );\r
4721                         //-----------------\r
4722                         #endregion\r
4723                 }\r
4724                 private void listViewAVIリスト_KeyPress( object sender, KeyPressEventArgs e )\r
4725                 {\r
4726                         #region [ ENTER が押下されたら、動画プロパティを開いて編集する。]\r
4727                         //-----------------\r
4728                         if( e.KeyChar == (char) Keys.Return ) \r
4729                         {\r
4730                                 if( this.mgrAVIリスト管理者.n現在選択中のItem番号0to1294 < 0 )\r
4731                                         return;         // 選択されてない\r
4732 \r
4733                                 this.mgrAVIリスト管理者.t動画プロパティを開いて編集する( this.mgrAVIリスト管理者.n現在選択中のItem番号0to1294 + 1, this.str作業フォルダ名 );\r
4734                         }\r
4735                         //-----------------\r
4736                         #endregion\r
4737                 }\r
4738                 private void listViewAVIリスト_MouseEnter( object sender, EventArgs e )\r
4739                 {\r
4740                         #region [ AVIリストにフォーカスを移動する。]\r
4741                         //-----------------\r
4742                         if( this.appアプリ設定.AutoFocus )\r
4743                                 this.mgrAVIリスト管理者.tAVIリストにフォーカスを当てる();\r
4744                         //-----------------\r
4745                         #endregion\r
4746                 }\r
4747                 private void listViewAVIリスト_RetrieveVirtualItem( object sender, RetrieveVirtualItemEventArgs e )\r
4748                 {\r
4749                         e.Item = this.mgrAVIリスト管理者.tCAVIとListViewItemを生成して返す( e.ItemIndex + 1 );\r
4750                 }\r
4751                 private void listViewAVIリスト_SelectedIndexChanged( object sender, EventArgs e )\r
4752                 {\r
4753                         #region [ WAV, BMP, AVI のカーソルを、選択された行に全部合わせる。]\r
4754                         //-----------------\r
4755                         if( this.listViewAVIリスト.SelectedIndices.Count > 0 )\r
4756                                 this.tWAV_BMP_AVIリストのカーソルを全部同じ行に合わせる( this.listViewAVIリスト.SelectedIndices[ 0 ] );\r
4757                         //-----------------\r
4758                         #endregion\r
4759                 }\r
4760 \r
4761                 private void toolStripButtonAVIリスト上移動_Click( object sender, EventArgs e )\r
4762                 {\r
4763                         #region [ 上の行とAVIを交換する。]\r
4764                         //-----------------\r
4765                         if( this.listViewAVIリスト.SelectedIndices.Count <= 0 )\r
4766                                 return; // 選択されていない\r
4767 \r
4768                         int n選択されたItem番号0to1294 = this.listViewAVIリスト.SelectedIndices[ 0 ];\r
4769 \r
4770                         if( n選択されたItem番号0to1294 == 0 )\r
4771                                 return; // 最上行なので無視\r
4772 \r
4773                         this.mgrAVIリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 - 1 );\r
4774                         //-----------------\r
4775                         #endregion\r
4776                 }\r
4777                 private void toolStripButtonAVIリスト下移動_Click( object sender, EventArgs e )\r
4778                 {\r
4779                         #region [ 下の行とAVIを交換する。]\r
4780                         //-----------------\r
4781                         if( this.listViewAVIリスト.SelectedIndices.Count <= 0 )\r
4782                                 return; // 選択されていない\r
4783 \r
4784                         int n選択されたItem番号0to1294 = this.listViewAVIリスト.SelectedIndices[ 0 ];\r
4785 \r
4786                         if( n選択されたItem番号0to1294 >= 1294 )\r
4787                                 return; // 最下行なので無視\r
4788 \r
4789                         this.mgrAVIリスト管理者.tItemを交換する( n選択されたItem番号0to1294, n選択されたItem番号0to1294 + 1 );\r
4790                         //-----------------\r
4791                         #endregion\r
4792                 }\r
4793                 //-----------------\r
4794                 #endregion\r
4795                 #region [ GUIイベント:自由入力関連 ]\r
4796                 //-----------------\r
4797                 private string textBox自由入力欄_以前の値 = "";\r
4798                 private void textBox自由入力欄_TextChanged( object sender, EventArgs e )\r
4799                 {\r
4800                         // Undo/Redo リストを修正。\r
4801 \r
4802                         #region [ Undo/Redo リストを修正する。]\r
4803                         //-----------------\r
4804                         if( !CUndoRedo管理.bUndoRedoした直後 )\r
4805                         {\r
4806                                 CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
4807 \r
4808                                 if( ( oセル仮想 != null ) && oセル仮想.b所有権がある( this.textBox自由入力欄 ) )\r
4809                                 {\r
4810                                         // 既存のセルの値を更新。\r
4811 \r
4812                                         ( (CUndoRedoセル<string>) oセル仮想 ).変更後の値 = this.textBox自由入力欄.Text;\r
4813                                 }\r
4814                                 else\r
4815                                 {\r
4816                                         // 新しいセルを追加。\r
4817 \r
4818                                         this.mgrUndoRedo管理者.tノードを追加する(\r
4819                                                 new CUndoRedoセル<string>(\r
4820                                                         this.textBox自由入力欄, \r
4821                                                         new DGUndoを実行する<string>( this.textBox自由入力欄_Undo ),\r
4822                                                         new DGRedoを実行する<string>( this.textBox自由入力欄_Redo ),\r
4823                                                         this.textBox自由入力欄_以前の値, this.textBox自由入力欄.Text ) );\r
4824 \r
4825 \r
4826                                         // Undoボタンを有効にする。\r
4827 \r
4828                                         this.tUndoRedo用GUIの有効無効を設定する();\r
4829                                 }\r
4830                         }\r
4831                         //-----------------\r
4832                         #endregion\r
4833 \r
4834 \r
4835                         // Undo 用に値を保管しておく。\r
4836 \r
4837                         this.textBox自由入力欄_以前の値 = this.textBox自由入力欄.Text;\r
4838 \r
4839 \r
4840                         // 完了。\r
4841 \r
4842                         CUndoRedo管理.bUndoRedoした直後 = false;\r
4843                         this.b未保存 = true;\r
4844                 }\r
4845                 private void textBox自由入力欄_Leave( object sender, EventArgs e )\r
4846                 {\r
4847                         CUndoRedoセル仮想 oセル仮想 = this.mgrUndoRedo管理者.tUndoするノードを取得して返す_見るだけ();\r
4848 \r
4849                         if( oセル仮想 != null )\r
4850                                 oセル仮想.t所有権の放棄( this.textBox自由入力欄 );\r
4851                 }\r
4852                 private void textBox自由入力欄_Undo( string str変更前, string str変更後 )\r
4853                 {\r
4854                         // 変更前の値に戻す。\r
4855 \r
4856                         this.tタブを選択する( Eタブ種別.自由入力 );\r
4857 \r
4858                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
4859                         this.textBox自由入力欄.Text = str変更前;\r
4860 \r
4861                         this.textBox自由入力欄.Focus();\r
4862                 }\r
4863                 private void textBox自由入力欄_Redo( string str変更前, string str変更後 )\r
4864                 {\r
4865                         // 変更後の値に戻す。\r
4866 \r
4867                         this.tタブを選択する( Eタブ種別.自由入力 );\r
4868 \r
4869                         this.t次のプロパティ変更処理がUndoRedoリストに載らないようにする();\r
4870                         this.textBox自由入力欄.Text = str変更後;\r
4871 \r
4872                         this.textBox自由入力欄.Focus();\r
4873                 }\r
4874                 //-----------------\r
4875                 #endregion\r
4876         \r
4877                 #region [ GUIイベント:メニューバー [ファイル] ]\r
4878                 //-----------------\r
4879                 private void toolStripMenuItem新規_Click( object sender, EventArgs e )\r
4880                 {\r
4881                         this.tシナリオ_新規作成();\r
4882                 }\r
4883                 private void toolStripMenuItem開く_Click( object sender, EventArgs e )\r
4884                 {\r
4885                         this.tシナリオ_開く();\r
4886                 }\r
4887                 private void toolStripMenuItem上書き保存_Click( object sender, EventArgs e )\r
4888                 {\r
4889                         this.tシナリオ_上書き保存();\r
4890                 }\r
4891                 private void toolStripMenuItem名前を付けて保存_Click( object sender, EventArgs e )\r
4892                 {\r
4893                         this.tシナリオ_名前をつけて保存();\r
4894                 }\r
4895                 private void toolStripMenuItem終了_Click( object sender, EventArgs e )\r
4896                 {\r
4897                         this.tシナリオ_終了();\r
4898                 }\r
4899                 private void toolStripMenuItem最近使ったファイル_Click( object sender, EventArgs e )\r
4900                 {\r
4901                         // ※このイベントハンドラに対応する「toolStripMenuItem最近使ったファイル」というアイテムはデザイナにはないので注意。\r
4902                         //   this.t最近使ったファイルをFileメニューへ追加する() の中で、手動で作って追加したアイテムに対するハンドラである。\r
4903 \r
4904                         if( this.t未保存なら保存する() == DialogResult.Cancel )\r
4905                                 return;\r
4906 \r
4907                         this.t演奏ファイルを開いて読み込む( ( (ToolStripMenuItem) sender ).Text.Substring( 3 ) );\r
4908                 }\r
4909                 //-----------------\r
4910                 #endregion\r
4911                 #region [ GUIイベント:メニューバー [編集] ]\r
4912                 //-----------------\r
4913                 private void toolStripMenuItemアンドゥ_Click( object sender, EventArgs e )\r
4914                 {\r
4915                         this.tシナリオ_Undoする();\r
4916                 }\r
4917                 private void toolStripMenuItemリドゥ_Click( object sender, EventArgs e )\r
4918                 {\r
4919                         this.tシナリオ_Redoする();\r
4920                 }\r
4921                 private void toolStripMenuItem切り取り_Click( object sender, EventArgs e )\r
4922                 {\r
4923                         this.tシナリオ_切り取り();\r
4924                 }\r
4925                 private void toolStripMenuItemコピー_Click( object sender, EventArgs e )\r
4926                 {\r
4927                         this.tシナリオ_コピー();\r
4928                 }\r
4929                 private void toolStripMenuItem貼り付け_Click( object sender, EventArgs e )\r
4930                 {\r
4931                         // マウスが譜面上にあるならそこから貼り付ける。\r
4932 \r
4933                         Point ptマウス位置 = this.pt現在のマウス位置を譜面の可視領域相対の座標dotで返す();\r
4934                         Size sz譜面の可視サイズ = this.sz譜面の可視領域の大きさdotを返す();\r
4935 \r
4936         \r
4937                         if( ( ( ptマウス位置.X < 0 ) || ( ptマウス位置.Y < 0 ) ) || ( ( ptマウス位置.X > sz譜面の可視サイズ.Width ) || ( ptマウス位置.Y > sz譜面の可視サイズ.Height ) ) )\r
4938                         {\r
4939                                 // マウスが譜面上になかった → 表示領域下辺から貼り付ける\r
4940 \r
4941                                 this.tシナリオ_貼り付け( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );\r
4942                         }\r
4943                         else\r
4944                         {\r
4945                                 // マウスが譜面上にあった\r
4946 \r
4947                                 this.tシナリオ_貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウス位置.Y ) );\r
4948                         }\r
4949                 }\r
4950                 private void toolStripMenuItem削除_Click( object sender, EventArgs e )\r
4951                 {\r
4952                         this.tシナリオ_削除();\r
4953                 }\r
4954                 private void toolStripMenuItemすべて選択_Click( object sender, EventArgs e )\r
4955                 {\r
4956                         // 編集モードなら強制的に選択モードにする。\r
4957 \r
4958                         if( this.b編集モードである )\r
4959                                 this.t選択モードにする();\r
4960 \r
4961 \r
4962                         // 全チップを選択する。\r
4963 \r
4964                         this.mgr選択モード管理者.t全チップを選択する();\r
4965                 }\r
4966                 private void toolStripMenuItem選択モード_Click( object sender, EventArgs e )\r
4967                 {\r
4968                         this.t選択モードにする();\r
4969                 }\r
4970                 private void toolStripMenuItem編集モード_Click( object sender, EventArgs e )\r
4971                 {\r
4972                         this.t編集モードにする();\r
4973                 }\r
4974                 private void toolStripMenuItemモード切替_Click( object sender, EventArgs e )\r
4975                 {\r
4976                         if( this.b選択モードである )\r
4977                         {\r
4978                                 this.t編集モードにする();\r
4979                         }\r
4980                         else\r
4981                         {\r
4982                                 this.t選択モードにする();\r
4983                         }\r
4984                 }\r
4985                 private void toolStripMenuItem検索_Click( object sender, EventArgs e )\r
4986                 {\r
4987                         this.tシナリオ_検索();\r
4988                 }\r
4989                 private void toolStripMenuItem置換_Click( object sender, EventArgs e )\r
4990                 {\r
4991                         this.tシナリオ_置換();\r
4992                 }\r
4993                 //-----------------\r
4994                 #endregion\r
4995                 #region [ GUIイベント:メニューバー [表示] ]\r
4996                 //-----------------\r
4997                 private void toolStripMenuItemチップパレット_Click( object sender, EventArgs e )\r
4998                 {\r
4999                         if( this.toolStripMenuItemチップパレット.CheckState == CheckState.Checked )\r
5000                         {\r
5001                                 this.dlgチップパレット.t表示する();\r
5002                         }\r
5003                         else\r
5004                         {\r
5005                                 this.dlgチップパレット.t隠す();\r
5006                         }\r
5007                 }\r
5008                 private void toolStripMenuItemガイド間隔4分_Click( object sender, EventArgs e )\r
5009                 {\r
5010                         this.tガイド間隔を変更する( 4 );\r
5011                 }\r
5012                 private void toolStripMenuItemガイド間隔8分_Click( object sender, EventArgs e )\r
5013                 {\r
5014                         this.tガイド間隔を変更する( 8 );\r
5015                 }\r
5016                 private void toolStripMenuItemガイド間隔12分_Click( object sender, EventArgs e )\r
5017                 {\r
5018                         this.tガイド間隔を変更する( 12 );\r
5019                 }\r
5020                 private void toolStripMenuItemガイド間隔16分_Click( object sender, EventArgs e )\r
5021                 {\r
5022                         this.tガイド間隔を変更する( 0x10 );\r
5023                 }\r
5024                 private void toolStripMenuItemガイド間隔24分_Click( object sender, EventArgs e )\r
5025                 {\r
5026                         this.tガイド間隔を変更する( 0x18 );\r
5027                 }\r
5028                 private void toolStripMenuItemガイド間隔32分_Click( object sender, EventArgs e )\r
5029                 {\r
5030                         this.tガイド間隔を変更する( 0x20 );\r
5031                 }\r
5032                 private void toolStripMenuItemガイド間隔48分_Click( object sender, EventArgs e )\r
5033                 {\r
5034                         this.tガイド間隔を変更する( 0x30 );\r
5035                 }\r
5036                 private void toolStripMenuItemガイド間隔64分_Click( object sender, EventArgs e )\r
5037                 {\r
5038                         this.tガイド間隔を変更する( 0x40 );\r
5039                 }\r
5040                 private void toolStripMenuItemガイド間隔フリー_Click( object sender, EventArgs e )\r
5041                 {\r
5042                         this.tガイド間隔を変更する( 0 );\r
5043                 }\r
5044                 private void toolStripMenuItemガイド間隔拡大_Click( object sender, EventArgs e )\r
5045                 {\r
5046                         switch( this.n現在のガイド間隔4to64or0 )\r
5047                         {\r
5048                                 case 4: break;\r
5049                                 case 8: this.tガイド間隔を変更する( 4 ); break;\r
5050                                 case 12: this.tガイド間隔を変更する( 8 ); break;\r
5051                                 case 16: this.tガイド間隔を変更する( 12 ); break;\r
5052                                 case 24: this.tガイド間隔を変更する( 16 ); break;\r
5053                                 case 32: this.tガイド間隔を変更する( 24 ); break;\r
5054                                 case 48: this.tガイド間隔を変更する( 32 ); break;\r
5055                                 case 64: this.tガイド間隔を変更する( 48 ); break;\r
5056                                 case 0: this.tガイド間隔を変更する( 64 ); break;\r
5057                         }\r
5058                 }\r
5059                 private void toolStripMenuItemガイド間隔縮小_Click( object sender, EventArgs e )\r
5060                 {\r
5061                         switch( this.n現在のガイド間隔4to64or0 )\r
5062                         {\r
5063                                 case 4: this.tガイド間隔を変更する( 8 ); break;\r
5064                                 case 8: this.tガイド間隔を変更する( 12 ); break;\r
5065                                 case 12: this.tガイド間隔を変更する( 16 ); break;\r
5066                                 case 16: this.tガイド間隔を変更する( 24 ); break;\r
5067                                 case 24: this.tガイド間隔を変更する( 32 ); break;\r
5068                                 case 32: this.tガイド間隔を変更する( 48 ); break;\r
5069                                 case 48: this.tガイド間隔を変更する( 64 ); break;\r
5070                                 case 64: this.tガイド間隔を変更する( 0 ); break;\r
5071                                 case 0: break;\r
5072                         }\r
5073                 }\r
5074                 //-----------------\r
5075                 #endregion\r
5076                 #region [ GUIイベント:メニューバー [再生] ]\r
5077                 //-----------------\r
5078                 private void toolStripMenuItem先頭から再生_Click( object sender, EventArgs e )\r
5079                 {\r
5080                         this.tシナリオ_Viewerで最初から再生する();\r
5081                 }\r
5082                 private void toolStripMenuItem現在位置から再生_Click( object sender, EventArgs e )\r
5083                 {\r
5084                         this.tシナリオ_Viewerで現在位置から再生する();\r
5085                 }\r
5086                 private void toolStripMenuItem現在位置からBGMのみ再生_Click( object sender, EventArgs e )\r
5087                 {\r
5088                         this.tシナリオ_Viewerで現在位置からBGMのみ再生する();\r
5089                 }\r
5090                 private void toolStripMenuItem再生停止_Click( object sender, EventArgs e )\r
5091                 {\r
5092                         this.tシナリオ_Viewerを再生停止する();\r
5093                 }\r
5094                 //-----------------\r
5095                 #endregion\r
5096                 #region [ GUIイベント:メニューバー [ツール] ]\r
5097                 //-----------------\r
5098                 private void toolStripMenuItemオプション_Click( object sender, EventArgs e )\r
5099                 {\r
5100                         this.mgrオプション管理者.tオプションダイアログを開いて編集し結果をアプリ設定に格納する();\r
5101                         this.mgr譜面管理者.tRefreshDisplayLanes(); // レーンの表示/非表示切り替えに備えて追加\r
5102                 }\r
5103                 private void toolStripMenuItemMIDIImport_Click( object sender, EventArgs e)\r
5104         {\r
5105             this.mgrMIDIインポート管理者.tMIDIインポート管理を開く();\r
5106             this.mgr譜面管理者.tRefreshDisplayLanes();     // レーンの表示/非表示切り替えに備えて追加\r
5107         }\r
5108                 //-----------------\r
5109                 #endregion\r
5110                 #region [ GUIイベント:メニューバー [ヘルプ] ]\r
5111                 //-----------------\r
5112                 private void toolStripMenuItemDTXCreaterマニュアル_Click( object sender, EventArgs e )\r
5113                 {\r
5114                         try\r
5115                         {\r
5116                                 // マニュアルを別プロセスとして開く。\r
5117 \r
5118                                 Process.Start( this.strDTXCのあるフォルダ名 + @"\Manual.chm" );\r
5119                         }\r
5120                         catch\r
5121                         {\r
5122                                 this.toolStripMenuItemDTXCreaterマニュアル.Enabled = false;\r
5123                         }\r
5124                 }\r
5125                 private void toolStripMenuItemバージョン_Click( object sender, EventArgs e )\r
5126                 {\r
5127                         this.dlgチップパレット.t一時的に隠蔽する();\r
5128 \r
5129                         Cバージョン情報 cバージョン情報 = new Cバージョン情報();\r
5130                         cバージョン情報.ShowDialog();\r
5131                         cバージョン情報.Dispose();\r
5132                         \r
5133                         this.dlgチップパレット.t一時的な隠蔽を解除する();\r
5134                 }\r
5135                 //-----------------\r
5136                 #endregion\r
5137 \r
5138                 #region [ GUIイベント:ツールバー ]\r
5139                 //-----------------\r
5140                 private void toolStripButton新規作成_Click( object sender, EventArgs e )\r
5141                 {\r
5142                         this.tシナリオ_新規作成();\r
5143                 }\r
5144                 private void toolStripButton開く_Click( object sender, EventArgs e )\r
5145                 {\r
5146                         this.tシナリオ_開く();\r
5147                 }\r
5148                 private void toolStripButton上書き保存_Click( object sender, EventArgs e )\r
5149                 {\r
5150                         this.tシナリオ_上書き保存();\r
5151                 }\r
5152                 private void toolStripButton切り取り_Click( object sender, EventArgs e )\r
5153                 {\r
5154                         this.tシナリオ_切り取り();\r
5155                 }\r
5156                 private void toolStripButtonコピー_Click( object sender, EventArgs e )\r
5157                 {\r
5158                         this.tシナリオ_コピー();\r
5159                 }\r
5160                 private void toolStripButton貼り付け_Click( object sender, EventArgs e )\r
5161                 {\r
5162                         // マウスが譜面上にあるならそこから貼り付ける。\r
5163 \r
5164                         Point ptマウスの位置 = this.pt現在のマウス位置を譜面の可視領域相対の座標dotで返す();\r
5165                         Size sz譜面の可視サイズ = this.sz譜面の可視領域の大きさdotを返す();\r
5166 \r
5167 \r
5168                         if( ( ( ptマウスの位置.X < 0 ) || ( ptマウスの位置.Y < 0 ) ) || ( ( ptマウスの位置.X > sz譜面の可視サイズ.Width ) || ( ptマウスの位置.Y > sz譜面の可視サイズ.Height ) ) )\r
5169                         {\r
5170                                 // マウスが譜面上になかった → 表示領域下辺から貼り付ける\r
5171 \r
5172                                 this.tシナリオ_貼り付け( this.mgr譜面管理者.n現在の譜面表示下辺の譜面先頭からの位置grid );\r
5173                         }\r
5174                         else\r
5175                         {\r
5176                                 // マウスが譜面上にあった\r
5177 \r
5178                                 this.tシナリオ_貼り付け( this.mgr譜面管理者.nY座標dotが位置するgridを返す_ガイド幅単位( ptマウスの位置.Y ) );\r
5179                         }\r
5180                 }\r
5181                 private void toolStripButton削除_Click( object sender, EventArgs e )\r
5182                 {\r
5183                         this.tシナリオ_削除();\r
5184                 }\r
5185                 private void toolStripButtonアンドゥ_Click( object sender, EventArgs e )\r
5186                 {\r
5187                         this.tシナリオ_Undoする();\r
5188                 }\r
5189                 private void toolStripButtonリドゥ_Click( object sender, EventArgs e )\r
5190                 {\r
5191                         this.tシナリオ_Redoする();\r
5192                 }\r
5193                 private void toolStripButtonチップパレット_Click( object sender, EventArgs e )\r
5194                 {\r
5195                         if( this.toolStripButtonチップパレット.CheckState == CheckState.Checked )\r
5196                         {\r
5197                                 this.dlgチップパレット.t表示する();\r
5198                         }\r
5199                         else\r
5200                         {\r
5201                                 this.dlgチップパレット.t隠す();\r
5202                         }\r
5203                 }\r
5204                 private void toolStripComboBox譜面拡大率_SelectedIndexChanged( object sender, EventArgs e )\r
5205                 {\r
5206                         C小節.n基準の高さdot = 192 * ( this.toolStripComboBox譜面拡大率.SelectedIndex + 1 );\r
5207                         \r
5208                         this.pictureBox譜面パネル.Refresh();\r
5209                 }\r
5210                 private void toolStripComboBoxガイド間隔_SelectedIndexChanged( object sender, EventArgs e )\r
5211                 {\r
5212                         switch( this.toolStripComboBoxガイド間隔.SelectedIndex )\r
5213                         {\r
5214                                 case 0:\r
5215                                         this.tガイド間隔を変更する( 4 );\r
5216                                         return;\r
5217 \r
5218                                 case 1:\r
5219                                         this.tガイド間隔を変更する( 8 );\r
5220                                         return;\r
5221 \r
5222                                 case 2:\r
5223                                         this.tガイド間隔を変更する( 12 );\r
5224                                         return;\r
5225 \r
5226                                 case 3:\r
5227                                         this.tガイド間隔を変更する( 16 );\r
5228                                         return;\r
5229 \r
5230                                 case 4:\r
5231                                         this.tガイド間隔を変更する( 24 );\r
5232                                         return;\r
5233 \r
5234                                 case 5:\r
5235                                         this.tガイド間隔を変更する( 32 );\r
5236                                         return;\r
5237 \r
5238                                 case 6:\r
5239                                         this.tガイド間隔を変更する( 48 );\r
5240                                         return;\r
5241 \r
5242                                 case 7:\r
5243                                         this.tガイド間隔を変更する( 64 );\r
5244                                         return;\r
5245 \r
5246                                 case 8:\r
5247                                         this.tガイド間隔を変更する( 0 );\r
5248                                         return;\r
5249                         }\r
5250                 }\r
5251                 private void toolStripButton選択モード_Click( object sender, EventArgs e )\r
5252                 {\r
5253                         this.t選択モードにする();\r
5254                 }\r
5255                 private void toolStripButton編集モード_Click( object sender, EventArgs e )\r
5256                 {\r
5257                         this.t編集モードにする();\r
5258                 }\r
5259                 private void toolStripButton先頭から再生_Click( object sender, EventArgs e )\r
5260                 {\r
5261                         this.tシナリオ_Viewerで最初から再生する();\r
5262                 }\r
5263                 private void toolStripButton現在位置から再生_Click( object sender, EventArgs e )\r
5264                 {\r
5265                         this.tシナリオ_Viewerで現在位置から再生する();\r
5266                 }\r
5267                 private void toolStripButton現在位置からBGMのみ再生_Click( object sender, EventArgs e )\r
5268                 {\r
5269                         this.tシナリオ_Viewerで現在位置からBGMのみ再生する();\r
5270                 }\r
5271                 private void toolStripButton再生停止_Click( object sender, EventArgs e )\r
5272                 {\r
5273                         this.tシナリオ_Viewerを再生停止する();\r
5274                 }\r
5275 \r
5276                 //private void ToolStripMenuItemBeatChipsGeneration_Click( object sender, EventArgs e )                 // Beat Detections\r
5277                 //{\r
5278                 //    GenarateBeatChip_Main();\r
5279                 //}\r
5280 \r
5281 \r
5282                 // 2度続けて実行するとチップが増えておかしくなる?要調査。\r
5283                 private void GenarateBeatChip_Main()\r
5284                 {\r
5285                         string filename = "";\r
5286 \r
5287                         #region [ マウスカーソルを待機中に変更 (アプリウインドウ外で右クリックメニュー選択していると、効果がない・・・) ]\r
5288                         this.Cursor = Cursors.WaitCursor;\r
5289                         #endregion\r
5290 \r
5291 \r
5292                         #region [ BGM, BPM, BEATレーンのレーン番号を取得 ]\r
5293                         int laneBGM = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BGM" );\r
5294                         int laneBPM = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BPM" );\r
5295                         int laneBEAT = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );\r
5296                         #endregion\r
5297 \r
5298                         #region [ BPM,BEATレーンの情報を消去 ]\r
5299                         this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBPM );\r
5300                         this.tシナリオ_削除();\r
5301                         this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBEAT );\r
5302                         this.tシナリオ_削除();\r
5303                         #endregion\r
5304 \r
5305                         #region [ BGMレーンにあるチップを抽出して、beat検出する対象のサウンドファイルを決める ]\r
5306                         // とりあえずBGMチップは1個しかない前提で進める。追々、複数のBGMチップでも動作するようにはしたい。\r
5307                         #region [ BGMチップ抽出 ]\r
5308                         int nBGMチップの小節番号 = -1;\r
5309                         int nBGMチップのindex = -1;\r
5310                         foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )\r
5311                         {\r
5312                                 C小節 c小節 = pair.Value;\r
5313                                 nBGMチップのindex = c小節.listチップ.FindIndex(\r
5314                                         delegate( Cチップ cチップ )\r
5315                                         {\r
5316                                                 return ( cチップ.nレーン番号0to == laneBGM );\r
5317                                         }\r
5318                                 );\r
5319                                 if ( nBGMチップのindex >= 0 )\r
5320                                 {\r
5321                                         nBGMチップの小節番号 = c小節.n小節番号0to3599;\r
5322                                         filename = this.mgrWAVリスト管理者.tファイル名を絶対パスで返す( c小節.listチップ[ nBGMチップのindex ].n値_整数1to1295);\r
5323                                         Debug.WriteLine( filename );\r
5324                                         break;  // とりあえず1個見つけたらbreakしちゃう\r
5325                                 }\r
5326                                 //for ( int i = 0; i < c小節.listチップ.Count; i++ )\r
5327                                 //{\r
5328                                 //Cチップ cチップ = c小節.listチップ[ i ];\r
5329                                 //if ( cチップ.nレーン番号0to == lane )\r
5330                                 //{\r
5331                                 //    nBGMチップのindex = i;\r
5332                                 //    filename = this.mgrWAVリスト管理者.tファイル名を絶対パスで返す( cチップ.n値・整数1to1295 );\r
5333                                 //    Debug.WriteLine( filename );\r
5334                                 //}\r
5335                                 //}\r
5336                         }\r
5337                         #endregion\r
5338                         #endregion\r
5339 \r
5340 \r
5341 \r
5342                         #region [ BASSFXのBeat detectionを実行する ]\r
5343                         FDK.CBeatDetect cbd = new CBeatDetect( filename );\r
5344 \r
5345                         float tempo = cbd.GetTempo();\r
5346 // Debug.WriteLine( "BPM=" + tempo );\r
5347 \r
5348                         List<FDK.CBeatDetect.stBeatPos> listBeatPositions = cbd.GetBeatPositions();\r
5349 // Debug.WriteLine( "Count: " + listBeatPositions.Count );\r
5350                         #endregion\r
5351 \r
5352                         // 四分音符以下、8分音符以下などと選べるようにしたい。\r
5353                         #region [ 四分音符以下の間隔で検出されたbeatを、端折る。端折らないと、検出beat数が多過ぎて、人が扱えなくなる。ただ、端折り方はもう少し熟慮が必要。]\r
5354                         float last = 0;\r
5355                         float minBeatDelta = 60.0f / tempo;             // 4分音符の長さ\r
5356                         int count = 10;\r
5357 \r
5358                         // 最初の10個くらいは、端折らない。まず拍の頭をとるのに必要な情報を落とすわけにはいかないので。\r
5359                         // 10個目以降は、四分音符未満の長さのbeatを、端折る。(裏BEATレーンに回す)\r
5360                         //if ( listBeatPositions.Count > 10 )\r
5361                         //{\r
5362                         //    for ( int i = count; i < listBeatPositions.Count; i++ )\r
5363                         //    {\r
5364                         //        if ( listBeatPositions[ i ].fBeatTime - last < minBeatDelta )\r
5365                         //        {\r
5366                         //            FDK.CBeatDetect.stBeatPos sbp = new CBeatDetect.stBeatPos(\r
5367                         //                listBeatPositions[ i ].fBeatTime,\r
5368                         //                0,\r
5369                         //                0,\r
5370                         //                0,\r
5371                         //                ( listBeatPositions[ i ].fBeatTime - last < minBeatDelta ),\r
5372                         //                true\r
5373                         //            );\r
5374 \r
5375                         //            listBeatPositions[ i ] = sbp;\r
5376                         //        }\r
5377                         //        last = listBeatPositions[ i ].fBeatTime;\r
5378                         //    }\r
5379                         //}\r
5380                         #endregion\r
5381 \r
5382                         #region [ ただのデバッグ表示 ]\r
5383                         //last = 0;\r
5384                         //for ( int i = 0; i < listBeatPositions.Count; i++ )\r
5385                         //{\r
5386                         //    //Debug.WriteLine( listBeatPositionsLight[ i ] - last );\r
5387                         //    Debug.WriteLine( listBeatPositions[ i ].fBeatTime );\r
5388                         //    last = listBeatPositions[ i ].fBeatTime;\r
5389                         //}\r
5390                         //Debug.WriteLine( "========================" );\r
5391                         #endregion\r
5392 \r
5393                         #region [ 未使用: 端折った区間内で、それぞれBPMを再取得してみる → これは意味なし。1つのbeatしか得られないため、正しいBPMを取得できない。]\r
5394                         //List<float> listTempo_interval = new List<float>();\r
5395                         //last = 0;\r
5396                         //for ( int i = 0; i < listBeatPositionsLight.Count - 1; i++ )\r
5397                         //{\r
5398                         //    listTempo_interval.Add( cbd.GetTempo( last, listBeatPositionsLight[ i ] ) );\r
5399                         //    last = listBeatPositionsLight[ i ];\r
5400                         //    Debug.WriteLine( listTempo_interval[ i ] );\r
5401                         //}\r
5402                         #endregion\r
5403 \r
5404 \r
5405                         int n1拍目のBeatPositionIndex = 0;\r
5406 \r
5407                         #region [ 1小節目の頭に1発目の拍が来るよう、BGMチップをずらす。ただしこれだけだと、最大1grid分の時間誤差が発生する。(BPM=125時に最大10msの誤差)]\r
5408                         int nBGM位置grid = 0;\r
5409                         if ( nBGMチップの小節番号 >= 0 && nBGMチップのindex >= 0 )\r
5410                         {\r
5411                                 //      float f小節長倍率 = 1.0f;\r
5412                                 C小節 c小節_0小節目 = this.mgr譜面管理者.dic小節[ nBGMチップの小節番号 ];\r
5413                                 Cチップ cチップBGM = c小節_0小節目.listチップ[ nBGMチップのindex ];\r
5414                                 nBGM位置grid = (int) ( 192f * c小節_0小節目.f小節長倍率 * listBeatPositions[ n1拍目のBeatPositionIndex ].fBeatTime / ( ( 60 * 4 ) / tempo ) + 0.5 );\r
5415                                 // ここでnBGM位置Gridが192(x小節長)を超えることがある\r
5416                                 // → 192(x小節長)をひいて、次の小節に回す。(小節ごとに小節長倍率が変化する可能性があることに注意)\r
5417                                 // → スマン、この実装ではまだ、DTXデータの最初はしばらく小節倍率が一定である前提になっちゃってる・・\r
5418                                 cチップBGM.n位置grid = (int) ( 192 * c小節_0小節目.f小節長倍率 + 0.5f ) - ( nBGM位置grid % 192 );                      // "192-" が必要なことに注意\r
5419                                 c小節_0小節目.listチップ[ nBGMチップのindex ] = cチップBGM;\r
5420                                 this.mgr譜面管理者.dic小節[ nBGMチップの小節番号 ] = c小節_0小節目;\r
5421                         }\r
5422                         #endregion\r
5423 \r
5424                         #region [ 0小節目のBPMを設定し、1つ目の拍が1小節目の頭に来るようにする。]\r
5425                         // まず、0小節の頭にBPM設定を追加する。\r
5426                         this.mgr編集モード管理者.tBPMチップを配置する( 0 * 192, tempo );                        // 既にBPMチップが配置されている場合の処理は????????????????\r
5427                         this.numericUpDownBPM.Value = (decimal) ( (int) ( tempo + 0.5 ) );\r
5428                         numericUpDownBPM_ValueChanged( null, null );\r
5429                         numericUpDownBPM_Leave( null, null );\r
5430 \r
5431                         // 更に、先の1グリッド分の誤差をなくすために、BGMチップの位置だけでなく、0小節目のBPMも微調整する。\r
5432                         float f小節長倍率_ = this.mgr譜面管理者.dic小節[ nBGMチップの小節番号 ].f小節長倍率;                                   // 手抜き。すまん。\r
5433                         float fBGM再生直後のBPM = ( 60 * 4 ) * nBGM位置grid / ( 192.0f * f小節長倍率_ ) / listBeatPositions[ n1拍目のBeatPositionIndex ].fBeatTime;\r
5434                         this.mgr編集モード管理者.tBPMチップを配置する( 192 - ( nBGM位置grid % 192 ), fBGM再生直後のBPM );\r
5435                         #endregion\r
5436 \r
5437 \r
5438 \r
5439 // 頭の1個目のBEATチップがちゃんと配置されてないよ!!!!!\r
5440 \r
5441 \r
5442 \r
5443                         #region [ BEATレーンにチップを配置する ]\r
5444                         //                      int lastGrid = (int) ( 192 * this.mgr譜面管理者.dic小節[ 0 ].f小節長倍率 ); // 0小節目の倍率\r
5445                         //int last小節内Grid = 0;\r
5446                         //int last小節番号 = nBGMチップの小節番号;\r
5447                         int n最初の拍のある小節番号 = 1 + ( nBGM位置grid / 192 );\r
5448                         float lastBeatTime = listBeatPositions[ n1拍目のBeatPositionIndex ].fBeatTime;\r
5449                         int lastnGrid = -1;\r
5450 \r
5451                         for ( int index = n1拍目のBeatPositionIndex; index < listBeatPositions.Count; index++ )\r
5452                         {\r
5453                                 //Debug.Write( "[" + index + "] " );\r
5454 \r
5455                                 // 今注目しているBEATチップが、どの小節・拍(grid)に収まるかを計算する\r
5456                                 //              // 誤差を小さくするため、直前のBEATポイントからの相対位置として計算すること。\r
5457                                 //              // 絶対位置で計算すると、最初のBPM計算の誤差がそのままBEAT位置に現れる。                         // やり残し★★★★★★\r
5458                                 //              // ...としたいのだが、まだできてない。全部絶対位置で計算している。\r
5459                                 FDK.CBeatDetect.stBeatPos sbp = listBeatPositions[ index ];\r
5460 \r
5461                                 float deltatime = sbp.fBeatTime - lastBeatTime;\r
5462                                 //Debug.Write( "delta=" + deltatime );\r
5463                                 int n小節番号 = n最初の拍のある小節番号;\r
5464                                 float f1小節の時間 = ( 60 / tempo ) * 4;\r
5465                                 #region [ 0小節目の場合 ]\r
5466                                 if ( deltatime < 0 )\r
5467                                 {\r
5468                                         while ( n小節番号 >= 0 && deltatime < 0 )\r
5469                                         {\r
5470                                                 n小節番号--;\r
5471                                                 deltatime += f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率;\r
5472                                                 //(int) ( 192 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 );  // 0小節目の倍率\r
5473                                         }\r
5474                                         if ( deltatime < 0 )\r
5475                                         {\r
5476                                                 Debug.WriteLine( "[" + index + "]: deltatime < 0; error (" + deltatime );\r
5477                                                 continue;\r
5478                                         }\r
5479                                 }\r
5480                                 #endregion\r
5481                                 #region [ 1小節目以降の場合 ]\r
5482                                 else\r
5483                                 {\r
5484                                         //Debug.Write( " + " + f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 * last小節内Grid / 192 + "(" + lastGrid + "|" + last小節内Grid +")=" );\r
5485                                         //                                      deltatime += f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 * last小節内Grid / 192;         // 直前のgrid(その小節の頭から)の分\r
5486                                         //Debug.WriteLine( deltatime );\r
5487                                         while ( true )\r
5488                                         {\r
5489                                                 if ( deltatime < f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率 )\r
5490                                                 {\r
5491                                                         break;\r
5492                                                 }\r
5493                                                 n小節番号++;\r
5494 \r
5495                                                 #region [ 小節ノードが不足しているなら、追加する ]\r
5496                                                 if ( this.mgr譜面管理者.n現在の最大の小節番号を返す() < n小節番号 )\r
5497                                                 {\r
5498                                                         for ( int i = n小節番号; i < n小節番号 + 5; i++ )\r
5499                                                         {\r
5500                                                                 this.mgr譜面管理者.dic小節.Add( i, new C小節( i ) );\r
5501                                                                 this.mgrUndoRedo管理者.tノードを追加する( new CUndoRedoセル<int>( null, new DGUndoを実行する<int>( this.mgr譜面管理者.t小節挿入のUndo ), new DGRedoを実行する<int>( this.mgr譜面管理者.t小節挿入のRedo ), i, i ) );\r
5502                                                         }\r
5503                                                 }\r
5504                                                 #endregion\r
5505 \r
5506                                                 deltatime -= f1小節の時間 * this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率;\r
5507                                         }\r
5508                                         if ( deltatime < 0 )\r
5509                                         {\r
5510                                                 Debug.WriteLine( "[" + index + "]: deltatime < 0; error (" + deltatime );\r
5511                                                 continue;\r
5512                                         }\r
5513                                 }\r
5514                                 #endregion\r
5515 \r
5516                                 // ここまでで、n小節番号を得ている\r
5517                                 // ここで、更にgridを得たうえで、16分音符相当にquantizeして、BEATチップの位置とする\r
5518 \r
5519                                 #region [ BEATチップを置く ]\r
5520                                 float f小節長倍率 = this.mgr譜面管理者.dic小節[ n小節番号 ].f小節長倍率;\r
5521                                 int n小節内Grid = (int) ( 192f * f小節長倍率 * deltatime / ( ( 60 * 4 ) / tempo ) + 0.5 );\r
5522 \r
5523                                 #region [ Gridを16分音符単位(==12grid単位)でquantizeする ]\r
5524                                 //Debug.Write( "nGrid: " + n小節内Grid + " -> " );\r
5525                                 n小節内Grid = ( ( n小節内Grid + 6 ) / 12 ) * 12;\r
5526                                 //Debug.WriteLine( n小節内Grid );\r
5527                                 #endregion\r
5528 \r
5529                                 int nGrid = this.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( n小節番号 ) + n小節内Grid;\r
5530 \r
5531                                 if ( lastnGrid != nGrid )\r
5532                                 {\r
5533                                         // indexを+1しているのは、チップ番号を01から開始するため。\r
5534                                         this.mgr編集モード管理者.tBeatチップを配置する( nGrid, index + 1, sbp.fBeatTime, sbp.b無効 );\r
5535                                         //                              this.mgr編集モード管理者.tHHチップを配置する( nGrid, 1, sbp.b無効 );  // デバッグ用・見やすくするために暫定的に。\r
5536                                         sbp.nGrid = nGrid;\r
5537                                         sbp.n小節番号 = n小節番号;\r
5538                                         listBeatPositions[ index ] = sbp;               // Grid情報を入れて、listを更新 (この情報はBPx挿入時に使う)\r
5539                                         lastnGrid = nGrid;\r
5540                                 }\r
5541                                 //if ( !sbp.b無効 )\r
5542                                 {\r
5543                                         //lastGrid = nGrid;\r
5544                                         //last小節内Grid = n小節内Grid;\r
5545                                         //last小節番号 = n小節番号;\r
5546                                         //lastBeatTime = sbp.fBeatTime;\r
5547                                 }\r
5548                                 #endregion\r
5549                                 //Debug.WriteLine( "[" + index + "]: n小節番号=" + n小節番号 + ", Grid= " + n小節内Grid + "/" + nGrid + ", BeatTime=" + sbp.fBeatTime + ", 裏=" + sbp.b無効 );\r
5550                         }\r
5551                         #endregion\r
5552 \r
5553                         BPMchipsGeneneration_Main();\r
5554 \r
5555                         #region [ マウスカーソルの形を元に戻す ]\r
5556                         this.Cursor = Cursors.Default;\r
5557                         #endregion\r
5558 \r
5559                         cbd.Dispose();\r
5560                         cbd = null;\r
5561 \r
5562                         #region [ Beatレーンを表示する ]\r
5563                         this.mgr譜面管理者.listレーン[ laneBEAT ].bIsVisible = true;\r
5564                         #endregion\r
5565 \r
5566                         #region [ 画面の再描画 ]\r
5567                         this.pictureBox譜面パネル.Invalidate();\r
5568                         #endregion\r
5569 \r
5570                         #region [ listBeatPositionsの開放 ]\r
5571                         listBeatPositions.Clear();\r
5572                         listBeatPositions = null;\r
5573                         #endregion\r
5574                 }\r
5575 \r
5576                 //private void ToolStripMenuItemBPMChipsGeneration_Click( object sender, EventArgs e )\r
5577                 //{\r
5578                 //    BPMchipsGeneneration_Main();\r
5579                 //}\r
5580 \r
5581                 private void BPMchipsGeneneration_Main()\r
5582                 {\r
5583                         #region [ BPMレーンとHHレーンを消去(0小節目を除く) ]\r
5584                         int laneBPM = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BPM" );\r
5585                         this.mgr選択モード管理者.tレーン上の全チップを選択する( laneBPM, 1 );\r
5586                         this.tシナリオ_削除();\r
5587 \r
5588                         #region [ デバッグ用: HHレーンを消去 ]\r
5589                         int laneHH = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "HH" );\r
5590                         this.mgr選択モード管理者.tレーン上の全チップを選択する( laneHH, 1 );\r
5591                         this.tシナリオ_削除();\r
5592                         #endregion\r
5593                         #endregion\r
5594 \r
5595                                                                                                                                                                                         //★★★★小節長1.00以外の場合に後で対応のこと。\r
5596                         #region [ BEATレーンから、listBestPositionを生成 ]\r
5597                         int laneBEAT = this.mgr譜面管理者.nレーン名に対応するレーン番号を返す( "BEAT" );\r
5598 //Debug.WriteLine( "laneBEAT=" + laneBEAT );\r
5599                         List<FDK.CBeatDetect.stBeatPos> listBeatPositions = new List<CBeatDetect.stBeatPos>();\r
5600                         foreach ( KeyValuePair<int, C小節> pair in this.mgr譜面管理者.dic小節 )\r
5601                         {\r
5602                                 C小節 c小節 = pair.Value;\r
5603                                 for ( int index = 0; index < c小節.listチップ.Count; index++ )\r
5604                                 {\r
5605                                         if ( c小節.listチップ[ index ].nレーン番号0to == laneBEAT &&\r
5606                                                 !c小節.listチップ[ index ].b裏 )\r
5607                                         {\r
5608                                                 int n小節番号 = c小節.n小節番号0to3599;\r
5609 //Debug.WriteLine( "n小節番号=" + c小節.n小節番号0to3599 + ", 小節内Grid=" + c小節.listチップ[ index ].n位置grid + ",lane=" + c小節.listチップ[ index ].nレーン番号0to + ", f値=" + c小節.listチップ[ index ].f値・浮動小数 );\r
5610 \r
5611                 \r
5612                                                 listBeatPositions.Add(\r
5613                                                         new CBeatDetect.stBeatPos(\r
5614                                                                 c小節.listチップ[ index ].f値_浮動小数,\r
5615                                                                 n小節番号,\r
5616                                                                 this.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( n小節番号 ) + c小節.listチップ[ index ].n位置grid,\r
5617                                                                 c小節.listチップ[ index ].n位置grid,\r
5618                                                                 c小節.listチップ[ index ].b裏,\r
5619                                                                 true\r
5620                                                         )\r
5621                                                 );\r
5622                                         }\r
5623                                         else\r
5624                                         {\r
5625 //Debug.WriteLine( "N小節番号=" + c小節.n小節番号0to3599 + ", 小節内Grid=" + c小節.listチップ[ index ].n位置grid + ",lane=" + c小節.listチップ[ index ].nレーン番号0to + ", f値=" + c小節.listチップ[ index ].f値・浮動小数 );\r
5626                                         }\r
5627                                 }\r
5628                         }\r
5629                         #endregion\r
5630 \r
5631 \r
5632                         #region [ BEATチップの位置に合わせて、BPMを計算し、BPxチップを配置する ]\r
5633 \r
5634                         int n1拍目のBeatPositionIndex = 0;\r
5635 \r
5636                         int lastindex = 0;\r
5637                         for ( int index = n1拍目のBeatPositionIndex; index < listBeatPositions.Count; index++ )\r
5638                         {\r
5639                                 if ( listBeatPositions[ index ].b無効 )\r
5640                                 {\r
5641                                         continue;\r
5642                                 }\r
5643                                 #region [ 次の有効なBeatPointを検出する ]\r
5644                                 int nextIndex = -1;\r
5645                                 for ( int i = index + 1; i < listBeatPositions.Count; i++ )\r
5646                                 {\r
5647                                         if ( listBeatPositions[ i ].bレーン表示する && !listBeatPositions[ i ].b無効 )\r
5648                                         //if ( listBeatPositions[ i ].bレーン表示する )\r
5649                                         {\r
5650                                                 nextIndex = i;\r
5651                                                 break;\r
5652                                         }\r
5653                                 }\r
5654                                 #endregion\r
5655 \r
5656                                 #region [ BPMチップを置く]\r
5657                                 //int lastgrid = (int) ( 192 * this.mgr譜面管理者.dic小節[ 0 ].f小節長倍率 );       // 0小節目の倍率\r
5658                                 //int lastindex = n1拍目のBeatPositionIndex;\r
5659                                 //int last小節番号 = nBGMチップの小節番号;\r
5660 \r
5661                                 if ( nextIndex >= 0 )\r
5662                                 {\r
5663                                         float deltatime = listBeatPositions[ nextIndex ].fBeatTime - listBeatPositions[ index ].fBeatTime;\r
5664 //Debug.WriteLine( "deltatime=" + deltatime+ ", nextIndex=" + nextIndex + ", fBeatTime(nextIndex)=" + listBeatPositions[ nextIndex ].fBeatTime+ ", index=" + index + ", fBeatTIme(index) =" + listBeatPositions[ index ].fBeatTime );\r
5665 \r
5666                                         //int current小節番号 = listBeatPositionsLight[ index ].n小節番号;\r
5667                                         //int next小節番号 = listBeatPositionsLight[ nextIndex ].n小節番号;\r
5668                                         int deltagrid = listBeatPositions[ nextIndex ].nGrid - listBeatPositions[ index ].nGrid;\r
5669 //Debug.WriteLine( "deltagrid=" + deltagrid + ", nextIndex=" + nextIndex + ", nGrid(nextIndex)=" + listBeatPositions[ nextIndex ].nGrid + ", index=" + index + ", nGrid(index) =" + listBeatPositions[ index ].nGrid );\r
5670                                         float fBPM = 60.0f / ( deltatime / deltagrid * 48 );            // 四分音符==48grid\r
5671 //Debug.WriteLine( "fBPM=" + fBPM + ", deltatime=" + deltatime + ", deltagrid=" + deltagrid );\r
5672 \r
5673                                         // BPMチップを配置する(裏BEATチップに対しては、配置しない)\r
5674                                         if ( nextIndex >= 0 )\r
5675                                         {\r
5676                                                 this.mgr編集モード管理者.tBPMチップを配置する( listBeatPositions[ index ].nGrid, fBPM );\r
5677 //      Debug.WriteLine( " tBPM: #" + index + "=" + fBPM );\r
5678                                         }\r
5679 \r
5680 \r
5681                                         //this.mgr編集モード管理者.tHHチップを配置する( listBeatPositions[ index ].nGrid, 1, listBeatPositions[ index ].b無効 );      // デバッグ用・見やすくするために暫定的に。\r
5682 \r
5683 // Debug.WriteLine( "(" + index + "->" + nextIndex + "): BPM=" + fBPM + ", nGrid=" + listBeatPositions[ index ].nGrid + ", deltagrid=" + deltagrid +" , deltatime=" + deltatime );\r
5684                                         lastindex = index;\r
5685                                 }\r
5686                                 #endregion\r
5687                         }\r
5688                         #region [ デバッグ用: HHチップを置く ]\r
5689                         for ( int index = n1拍目のBeatPositionIndex; index < listBeatPositions.Count; index++ )\r
5690                         {\r
5691                                 this.mgr編集モード管理者.tHHチップを配置する( listBeatPositions[ index ].nGrid, 1, listBeatPositions[ index ].b無効 );        // デバッグ用・見やすくするために暫定的に。\r
5692                         }\r
5693                         #endregion\r
5694 \r
5695                         #region [ listBeatPositionsの開放 ]\r
5696                         listBeatPositions.Clear();\r
5697                         listBeatPositions = null;\r
5698                         #endregion\r
5699 \r
5700                         #endregion\r
5701                 }\r
5702 \r
5703                 private void generateBeatChipsToolStripMenuItem_Click( object sender, EventArgs e )\r
5704                 {\r
5705                         GenarateBeatChip_Main();\r
5706                 }\r
5707 \r
5708                 private void generateBPMFromBeatChipsToolStripMenuItem_Click( object sender, EventArgs e )\r
5709                 {\r
5710                         BPMchipsGeneneration_Main();\r
5711                 }\r
5712 \r
5713                 private void toolStripComboBox演奏速度_SelectedIndexChanged( object sender, EventArgs e )\r
5714                 {\r
5715                         this.b再生速度を変更した = true;\r
5716                 }\r
5717 \r
5718                 public bool DetectDTXManiaProcess()\r
5719                 {\r
5720                         bool target = false;\r
5721 //Debug.WriteLine( "process start" );\r
5722                         for ( int i = 0; i < 5; i++ )           // 検索結果のハンドルがZeroになることがあるので、200ms間隔で5回リトライする\r
5723                         {\r
5724                                 #region [ 既に起動中のDTXManiaプロセスを検索する。]\r
5725                                 // このやり方だと、ShowInTaskbar=falseでタスクバーに表示されないパターンの時に検索に失敗するようだが\r
5726                                 // DTXManiaでそのパターンはない?のでこのままいく。\r
5727                                 // FindWindowを使えばこのパターンにも対応できるが、C#でビルドするアプリはウインドウクラス名を自前指定できないので、これは使わない。\r
5728 \r
5729                                 //Process current = Process.GetCurrentProcess();\r
5730                                 //Process[] running = Process.GetProcessesByName( current.ProcessName );\r
5731                                 string appPath = Application.ExecutablePath;\r
5732                                 string processname = Path.Combine( Path.GetDirectoryName( appPath ), "DTXManiaGR.exe" );\r
5733 //Debug.WriteLine( "processname=" + processname );\r
5734                                 //Process[] running = Process.GetProcesses();   // .GetProcessesByName( processname );\r
5735 \r
5736                                 System.Management.ManagementClass mc =\r
5737                                         new System.Management.ManagementClass( "Win32_Process" );\r
5738                                 System.Management.ManagementObjectCollection moc = mc.GetInstances();\r
5739                                 \r
5740                                 //IntPtr hWnd = FindWindow( null, "DTXMania .NET style release " + CDTXMania.VERSION );\r
5741 \r
5742                                 foreach ( System.Management.ManagementObject mo in moc )\r
5743                                 {\r
5744 //Debug.WriteLine( "filename=" + mo["ExecutablePath"] );\r
5745 //Debug.WriteLine( "2" );\r
5746 if ( (string)mo[ "ExecutablePath" ] == processname )\r
5747 {\r
5748 //Debug.WriteLine( "3" );\r
5749         //if ( mo["ProcessId"] != 0 )\r
5750         {\r
5751 //Debug.WriteLine( "4" );\r
5752                 target = true;\r
5753                 break;\r
5754         }\r
5755 }\r
5756 //Debug.WriteLine( "5" );\r
5757                                 }\r
5758                                 #endregion\r
5759 \r
5760                                 #region [ 起動中のDTXManiaがいれば、そのプロセスを返す ]\r
5761                                 if ( target != false )\r
5762                                 {\r
5763                                         break;\r
5764                                 }\r
5765                                 #endregion\r
5766                         }\r
5767 \r
5768 //Debug.WriteLine( "process end;" );\r
5769                         return target;\r
5770                 }\r
5771 \r
5772                 private void calcDifficultyToolStripMenuItem_Click(object sender, EventArgs e)\r
5773                 {\r
5774                         DTXCreator.コード._05.譜面.C難易度自動計算マン f = new コード._05.譜面.C難易度自動計算マン(this);\r
5775 \r
5776       Cメッセージポップアップ pop = new Cメッセージポップアップ(Resources.str難易度計算マン計算中);\r
5777       pop.Owner = this;\r
5778       pop.Show();\r
5779       pop.Refresh();\r
5780 \r
5781                         f.Prepare();\r
5782       hScrollBarDLEVEL.Value = f.DLevel;\r
5783                         hScrollBarGLEVEL.Value = f.GLevel;\r
5784                         hScrollBarBLEVEL.Value = f.BLevel;\r
5785       pop.Close();\r
5786                 }\r
5787 \r
5788                 //-----------------\r
5789                 #endregion\r
5790 \r
5791                 //-----------------\r
5792                 #endregion\r
5793         }\r
5794 }\r