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;
boolean[] trackMap;
boolean isAudio, pasteAudio;
for( int i = 0; i < tis.size(); i++ ) {
ti = (Track.Info) tis.get( i );
if( ti.selected ) { // ----------------- selected tracks -----------------
try {
ti.trail.editBegin( edit );
isAudio = ti.trail instanceof AudioTrail;
srcTrail = tl.getSubTrail( ti.trail.getClass() );
if( isAudio ) {
pasteAudio = (srcTrail != null) && (((AudioTrail) srcTrail).getChannelNum() > 0);
} else {
pasteAudio = false;
}
if( mode == EDIT_INSERT ) {
ti.trail.editInsert( this, insertSpan, edit );
if( cutTimeline ) ti.trail.editRemove( this, cutTimelineSpan, edit );
// } else if( (mode == EDIT_OVERWRITE) && (pasteAudio || !isAudio) ) { // Audio needs to be cleared even in Mix mode!
} else if( pasteAudio || ((mode == EDIT_OVERWRITE) && !isAudio) ) { // Audio needs to be cleared even in Mix mode!
ti.trail.editClear( this, insertSpan, edit );
}
if( pasteAudio ) {
audioTrail = (AudioTrail) ti.trail;
trackMap = tl.getTrackMap( ti.trail.getClass() );
//System.err.println( "clipboard tm : " );
//for( int x = 0; x < trackMap.length; x++ ) { System.err.println( " " + trackMap[ x ]); }
int[] trackMap2 = new int[ audioTrail.getChannelNum() ];
for( int j = 0, k = 0; j < trackMap2.length; j++ ) {
if( ti.trackMap[ 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.numTracks == 1) && (tl.getTrackNum( ti.trail.getClass() ) == 1) ) {
ti.trail.editAddAll( this, srcTrail.getCuttedRange(
copySpan, true, srcTrail.getDefaultTouchMode(), delta ), edit );
}