/*
* Created on 09-dic-2005
*
* TODO To change the template for this generated file go to Window -
* Preferences - Java - Code Style - Code Templates
*/
package org.herac.tuxguitar.gui.clipboard;
import org.herac.tuxguitar.gui.TuxGuitar;
import org.herac.tuxguitar.gui.editors.TablatureEditor;
import org.herac.tuxguitar.gui.undo.undoables.measure.UndoableInsertMeasure;
import org.herac.tuxguitar.gui.undo.undoables.measure.UndoableReplaceMeasures;
import org.herac.tuxguitar.song.helpers.TGSongSegment;
import org.herac.tuxguitar.song.helpers.TGSongSegmentHelper;
import org.herac.tuxguitar.song.models.TGMeasure;
import org.herac.tuxguitar.song.models.TGMeasureHeader;
import org.herac.tuxguitar.song.models.TGTrack;
/**
* @author julian
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class MeasureTransferable implements Transferable {
public static final int TRANSFER_TYPE_INSERT = 2;
public static final int TRANSFER_TYPE_REPLACE = 1;
private int pasteCount;
private TGSongSegment segment;
private TablatureEditor tablatureEditor;
private int transferType;
public MeasureTransferable(TablatureEditor tablatureEditor, int p1, int p2,
boolean allTracks) {
this.tablatureEditor = tablatureEditor;
this.transferType = TRANSFER_TYPE_REPLACE;
this.getTransfer(p1, p2, allTracks);
}
private void getTransfer(int p1, int p2, boolean allTracks) {
if (allTracks) {
this.segment = new TGSongSegmentHelper(TuxGuitar.instance()
.getSongManager()).copyMeasures(p1, p2);
} else {
TGTrack track = this.tablatureEditor.getTablature().getCaret().getTrack();
this.segment = new TGSongSegmentHelper(TuxGuitar.instance()
.getSongManager()).copyMeasures(p1, p2, track);
}
skipMarkers(this.segment);
}
public void insertMeasures(TGSongSegmentHelper helper, TGSongSegment segment)
throws CannotInsertTransferException {
TGMeasure measure = this.tablatureEditor.getTablature().getCaret()
.getMeasure();
TGTrack track = this.tablatureEditor.getTablature().getCaret().getTrack();
if (measure == null || segment.isEmpty()) {
throw new CannotInsertTransferException();
}
// Si el segmento tiene una sola pista,
// la pego en la pista seleccionada
int toTrack = ((segment.getTracks().size() == 1) ? track.getNumber() : 0);
// comienza el undoable
UndoableInsertMeasure undoable = new UndoableInsertMeasure(toTrack);
TuxGuitar.instance().getFileHistory().setUnsavedFile();
TGMeasureHeader first = (TGMeasureHeader) segment.getHeaders().get(0);
int fromNumber = measure.getNumber();
long theMove = (measure.getStart() - first.getStart());
helper.insertMeasures(segment.clone(), fromNumber, theMove, toTrack);
// termia el undoable
TuxGuitar.instance().getUndoableManager().addEdit(
undoable.endUndo(segment.clone(), segment.getHeaders().size(),
fromNumber, theMove));
}
public void insertTransfer() throws CannotInsertTransferException {
TGSongSegmentHelper helper = new TGSongSegmentHelper(TuxGuitar.instance()
.getSongManager());
TGSongSegment segment = helper.createSegmentCopies(this.segment,
this.pasteCount);
if (this.transferType == TRANSFER_TYPE_REPLACE) {
replaceMeasures(helper, segment);
} else if (this.transferType == TRANSFER_TYPE_INSERT) {
insertMeasures(helper, segment);
}
}
public void replaceMeasures(TGSongSegmentHelper helper, TGSongSegment segment)
throws CannotInsertTransferException {
TGMeasure measure = this.tablatureEditor.getTablature().getCaret()
.getMeasure();
TGTrack track = this.tablatureEditor.getTablature().getCaret().getTrack();
if (measure == null || segment.isEmpty()) {
throw new CannotInsertTransferException();
}
TGMeasureHeader first = (TGMeasureHeader) segment.getHeaders().get(0);
// Si el segmento tiene una sola pista,
// la pego en la pista seleccionada
int toTrack = ((segment.getTracks().size() == 1) ? track.getNumber() : 0);
// si no existen los compases los creo
int count = segment.getHeaders().size();
int current = measure.getNumber();
int freeSpace = (track.countMeasures() - (current - 1));
long theMove = (measure.getStart() - first.getStart());
// comienza el undoable
UndoableReplaceMeasures undoable = new UndoableReplaceMeasures(current,
(current + count), toTrack);
TuxGuitar.instance().getFileHistory().setUnsavedFile();
for (int i = freeSpace; i < count; i++) {
TuxGuitar.instance().getSongManager().addNewMeasureBeforeEnd();
}
helper.replaceMeasures(segment.clone(), theMove, toTrack);
// Termina el undoable
TuxGuitar.instance().getUndoableManager().addEdit(
undoable.endUndo(segment.clone(), count, freeSpace, theMove));
}
public void setPasteCount(int pasteCount) {
this.pasteCount = pasteCount;
}
public void setTransferType(int transferType) {
this.transferType = transferType;
}
private void skipMarkers(TGSongSegment segment) {
for (final TGMeasureHeader header : segment.getHeaders()) {
header.setMarker(null);
}
}
}