OSDN Git Service

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