final Span copySpan = (Span) context.getClientArg( "copySpan" );
final boolean cutTimeline = ((Boolean) context.getClientArg( "cut" )).booleanValue();
final Span cutTimelineSpan = (Span) context.getClientArg( "cutSpan" );
final long delta = insertPos - tl.getSpan().start;
Track.Info ti;
Trail srcTrail;
AudioTrail audioTrail;
// Transmitter trns;
boolean[] trackMap;
boolean isAudio, isTrns, pasteAudio;
//System.out.println( "paste to:" );
//Track.debugDump( tis );
for( int i = 0; i < tis.size(); i++ ) {
ti = (Track.Info) tis.get( i );
if( ti.selected ) { // ----------------- selected tracks -----------------
try {
ti.trail.editBegin( edit );
// EEE
// isAudio = ti.track instanceof AudioTrack;
isAudio = false;
isTrns = ti.tracks.get( 0 ) instanceof Transmitter;
srcTrail = tl.getSubTrail( ti.trail.getClass(), ti.trackIndex );
if( isAudio ) {
pasteAudio = (srcTrail != null) && (((AudioTrail) srcTrail).getChannelNum() > 0);
} else if( isTrns ) {
pasteAudio = (srcTrail != null);
} else {
pasteAudio = false;
}
if( mode == EDIT_INSERT ) {
ti.trail.editInsert( this, insertSpan, edit );
if( cutTimeline ) ti.trail.editRemove( this, cutTimelineSpan, edit );
} else if( pasteAudio || ((mode == EDIT_OVERWRITE) && !(isAudio || isTrns)) ) { // Audio needs to be cleared even in Mix mode!
ti.trail.editClear( this, insertSpan, edit );
}
if( pasteAudio ) {
audioTrail = (AudioTrail) ti.trail;
trackMap = tl.getChannelMap( srcTrail );
final int[] trackMap2 = new int[ audioTrail.getChannelNum() ];
for( int j = 0, k = 0; j < trackMap2.length; j++ ) {
if( ti.channelMap[ j ]) { // target track selected
for( ; (k < trackMap.length) && !trackMap[ k ] ; k++ ) ;
if( k < trackMap.length ) { // source track exiting
trackMap2[ j ] = k++;
} else if( tl.getTrackNum( ti.trail.getClass() ) > 0 ) { // ran out of source tracks, fold over (simple mono -> stereo par exemple)
for( k = 0; !trackMap[ k ] ; k++ ) ;
trackMap2[ j ] = k++;
} else {
trackMap2[ j ] = -1; // there aren't any clipboard tracks ....
}
} else { // target track not selected
trackMap2[ j ] = -1;
}
}
if( !audioTrail.copyRangeFrom( (AudioTrail) srcTrail, copySpan, insertPos, mode, this, edit, trackMap2, bcPre, bcPost )) return CANCELLED;
} else if( (ti.tracks.size() == 1) && (tl.getTrackNum( ti.trail.getClass() ) == 1) ) {
ti.trail.editAddAll( this, srcTrail.getCuttedRange(
copySpan, true, srcTrail.getDefaultTouchMode(), delta ), edit );
}
}
finally {
ti.trail.editEnd( edit );
}