OSDN Git Service

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