OSDN Git Service

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