--- /dev/null
+using System;
+using System.Collections.Generic;
+using System.Text;
+using DTXCreator.UndoRedo;
+
+namespace DTXCreator.譜面
+{
+ internal class Cクリップボード
+ {
+ public int nセル数
+ {
+ get
+ {
+ return this.cbボード.Count;
+ }
+ }
+
+ public Cクリップボード( Cメインフォーム form )
+ {
+ this._Form = form;
+ }
+ public void tクリアする()
+ {
+ this.cbボード.Clear();
+ }
+ public void tチップを指定位置から貼り付ける( C小節 cs配置開始小節, int n貼り付け先頭grid )
+ {
+ if( this.cbボード.Count != 0 )
+ {
+ List<Cクリップセル> list = new List<Cクリップセル>();
+ foreach( Cクリップセル cクリップセル in this.cbボード )
+ {
+ Cクリップセル item = new Cクリップセル();
+ item.pチップ = new Cチップ();
+ item.pチップ.tコピーfrom( cクリップセル.pチップ );
+ item.nレーン番号 = cクリップセル.nレーン番号;
+ item.n位置grid = cクリップセル.n位置grid;
+ item.b貼り付け済 = false;
+ list.Add( item );
+ }
+ int num = list[ 0 ].n位置grid;
+ foreach( Cクリップセル cクリップセル3 in list )
+ {
+ if( cクリップセル3.n位置grid < num )
+ {
+ num = cクリップセル3.n位置grid;
+ }
+ }
+ for( int i = 0; i < list.Count; i++ )
+ {
+ Cクリップセル local1 = list[ i ];
+ local1.n位置grid -= num;
+ Cクリップセル local2 = list[ i ];
+ local2.n位置grid += n貼り付け先頭grid;
+ }
+ this._Form.mgrUndoRedo管理者.tトランザクション記録を開始する();
+ C小節 c小節 = cs配置開始小節;
+ for( int j = 0; j < list.Count; j++ )
+ {
+ int num4 = list[ j ].n位置grid;
+ if( ( num4 >= 0 ) && ( num4 < c小節.n小節長倍率を考慮した現在の小節の高さgrid ) )
+ {
+ Cチップ cチップ = new Cチップ();
+ cチップ.tコピーfrom( list[ j ].pチップ );
+ cチップ.n位置grid = num4;
+ cチップ.bドラッグで選択中 = false;
+ cチップ.b確定選択中 = true;
+ c小節.listチップ.Add( cチップ );
+ Cチップ cc = new Cチップ();
+ cc.tコピーfrom( cチップ );
+ Cチップ配置用UndoRedo redo = new Cチップ配置用UndoRedo( c小節.n小節番号0to3599, cc );
+ this._Form.mgrUndoRedo管理者.tノードを追加する( new CUndoRedoセル<Cチップ配置用UndoRedo>( null, new DGUndoを実行する<Cチップ配置用UndoRedo>( this._Form.mgr譜面管理者.tチップ配置のUndo ), new DGRedoを実行する<Cチップ配置用UndoRedo>( this._Form.mgr譜面管理者.tチップ配置のRedo ), redo, redo ) );
+ c小節 = cs配置開始小節;
+ }
+ else
+ {
+ Cクリップセル local3 = list[ j ];
+ local3.n位置grid -= c小節.n小節長倍率を考慮した現在の小節の高さgrid;
+ int num5 = c小節.n小節番号0to3599 + 1;
+ c小節 = this._Form.mgr譜面管理者.p小節を返す( num5 );
+ if( c小節 == null )
+ {
+ c小節 = new C小節( num5 );
+ this._Form.mgr譜面管理者.dic小節.Add( num5, c小節 );
+ }
+ j--;
+ }
+ }
+ this._Form.mgrUndoRedo管理者.tトランザクション記録を終了する();
+ this._Form.tUndoRedo用GUIの有効無効を設定する();
+ list.Clear();
+ }
+ }
+ public void tチップを追加する( Cチップ cc, int nレーン番号, int n位置grid )
+ {
+ Cクリップセル item = new Cクリップセル();
+ item.pチップ = new Cチップ();
+ item.pチップ.tコピーfrom( cc );
+ item.nレーン番号 = nレーン番号;
+ item.n位置grid = n位置grid;
+ this.cbボード.Add( item );
+ }
+ public void t現在選択されているチップをボードにコピーする()
+ {
+ this.tクリアする();
+ foreach( KeyValuePair<int, C小節> pair in this._Form.mgr譜面管理者.dic小節 )
+ {
+ C小節 c小節 = pair.Value;
+ int num = this._Form.mgr譜面管理者.n譜面先頭からみた小節先頭の位置gridを返す( c小節.n小節番号0to3599 );
+ foreach( Cチップ cチップ in c小節.listチップ )
+ {
+ if( cチップ.b確定選択中 )
+ {
+ this.tチップを追加する( cチップ, cチップ.nレーン番号0to, num + cチップ.n位置grid );
+ }
+ }
+ }
+ }
+
+ #region [ private ]
+ //-----------------
+ private Cメインフォーム _Form;
+ private List<Cクリップセル> cbボード = new List<Cクリップセル>();
+ //-----------------
+ #endregion
+ }
+}