OSDN Git Service

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