OSDN Git Service

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