}
protected void perform()
{
final Span selSpan, deleteBefore, deleteAfter;
final BasicCompoundEdit edit;
final List tis;
Track.Info ti;
boolean success = false;
edit = new BasicCompoundEdit( getValue( NAME ).toString() );
try {
selSpan = timeline.getSelectionSpan();
// if( selSpan.isEmpty() ) return;
tis = Track.getInfos( selectedTracks.getAll(), tracks.getAll() );
deleteBefore = new Span( 0, selSpan.start );
deleteAfter = new Span( selSpan.stop, timeline.getLength() );
// deselect
edit.addPerform( TimelineVisualEdit.select( this, Session.this, new Span() ));
edit.addPerform( TimelineVisualEdit.position( this, Session.this, 0 ));
if( !deleteAfter.isEmpty() || !deleteBefore.isEmpty() ) {
for( int i = 0; i < tis.size(); i++ ) {
ti = (Track.Info) tis.get( i );
ti.trail.editBegin( edit );
try {
if( !deleteAfter.isEmpty() ) ti.trail.editRemove( this, deleteAfter, edit );
if( !deleteBefore.isEmpty() ) ti.trail.editRemove( this, deleteBefore, edit );
}
finally {
ti.trail.editEnd( edit );
}
}
}
edit.addPerform( new EditSetTimelineLength( this, Session.this, selSpan.getLength() ));
edit.addPerform( TimelineVisualEdit.select( this, Session.this, selSpan.shift( -selSpan.start )));
edit.perform();
edit.end();
getUndoManager().addEdit( edit );
success = true;
}
finally {
if( !success ) edit.cancel();
}
}