package org.herac.tuxguitar.song.helpers;
import java.util.ArrayList;
import java.util.List;
import org.herac.tuxguitar.gui.editors.tab.TGMeasureImpl;
import org.herac.tuxguitar.song.managers.TGSongManager;
import org.herac.tuxguitar.song.managers.TGTrackManager;
import org.herac.tuxguitar.song.models.Clef;
import org.herac.tuxguitar.song.models.TGMeasure;
import org.herac.tuxguitar.song.models.TGMeasureHeader;
import org.herac.tuxguitar.song.models.TGTrack;
public class TGSongSegmentHelper {
private TGSongManager sm;
public TGSongSegmentHelper(TGSongManager sm) {
this.sm = sm;
}
public TGSongSegment copyMeasures(int m1, int m2) {
TGSongSegment segment = new TGSongSegment();
int number1 = Math.max(1, m1);
int number2 = Math.min(this.sm.getSong().countMeasureHeaders(), m2);
for (int number = number1; number <= number2; number++) {
segment.getHeaders().add(this.sm.getMeasureHeader(number));
}
for (final TGTrack track : this.sm.getSong().getTracks()) {
List<TGMeasure> measures = new ArrayList<TGMeasure>();
for (int number = number1; number <= number2; number++) {
measures.add(this.sm.getTrackManager().getMeasure(track, number));
}
segment.addTrack(track.getNumber(), measures);
}
return segment.clone();
}
public TGSongSegment copyMeasures(int m1, int m2, TGTrack track) {
TGSongSegment segment = new TGSongSegment();
List<TGMeasure> measures = new ArrayList<TGMeasure>();
int number1 = Math.max(1, m1);
int number2 = Math.min(this.sm.getSong().countMeasureHeaders(), m2);
for (int number = number1; number <= number2; number++) {
segment.getHeaders().add(this.sm.getMeasureHeader(number));
measures.add(this.sm.getTrackManager().getMeasure(track, number));
}
segment.addTrack(track.getNumber(), measures);
return segment.clone();
}
public TGSongSegment createSegmentCopies(TGSongSegment srcSegment, int count) {
TGSongSegment segment = srcSegment.clone();
int mCount = segment.getHeaders().size();
int tCount = segment.getTracks().size();
TGMeasureHeader fMeasure = segment.getHeaders().get(0);
TGMeasureHeader lMeasure = segment.getHeaders().get(mCount - 1);
long mMove = ((lMeasure.getStart() + lMeasure.getLength()) - fMeasure
.getStart());
for (int i = 1; i < count; i++) {
for (int m = 0; m < mCount; m++) {
TGMeasureHeader header = segment.getHeaders().get(m).clone();
segment.getHeaders().add(header);
this.sm.moveMeasureHeader(header, (mMove * i), (mCount * i));
for (int t = 0; t < tCount; t++) {
TGTrackSegment track = segment.getTracks().get(t);
TGMeasure measure = track.getMeasures().get(m).clone(header);
track.getMeasures().add(measure);
this.sm.getMeasureManager().moveAllBeats(measure, (mMove * i));
}
}
}
return segment;
}
private List<TGMeasure> getEmptyMeasures(int count, Clef clef,
int keySignature) {
List<TGMeasure> measures = new ArrayList<TGMeasure>();
for (int i = 0; i < count; i++) {
TGMeasure measure = new TGMeasureImpl(null);
measure.setClef(clef);
measure.setKeySignature(keySignature);
measures.add(measure);
}
return measures;
}
public void insertMeasures(TGSongSegment segment, int fromNumber, long move,
int track) {
List<TGMeasureHeader> headers = new ArrayList<TGMeasureHeader>();
this.sm.moveMeasureHeaders(segment.getHeaders(), move, 0, false);
int headerNumber = fromNumber;
for (final TGMeasureHeader header : segment.getHeaders()) {
header.setNumber(headerNumber);
headers.add(header);
headerNumber++;
}
long start = headers.get(0).getStart();
long end = headers.get(headers.size() - 1).getStart()
+ headers.get(headers.size() - 1).getLength();
List<TGMeasureHeader> headersBeforeEnd = this.sm
.getMeasureHeadersBeforeEnd(start);
this.sm.moveMeasureHeaders(headersBeforeEnd, end - start, headers.size(),
true);
for (final TGMeasureHeader header : segment.getHeaders()) {
this.sm.addMeasureHeader(header.getNumber() - 1, header);
}
for (final TGTrack currTrack : this.sm.getSong().getTracks()) {
List<TGMeasure> measures = null;
for (final TGTrackSegment tSegment : segment.getTracks()) {
if (((track > 0 && segment.getTracks().size() == 1) ? track : tSegment
.getTrack()) == currTrack.getNumber()) {
measures = tSegment.getMeasures();
break;
}
}
if (measures == null) {
TGTrackManager tm = this.sm.getTrackManager();
TGMeasure measure = (fromNumber > 1 ? tm.getMeasure(currTrack,
(fromNumber - 1)) : tm.getMeasure(currTrack, headerNumber));
Clef clef = (measure != null ? measure.getClef()
: TGMeasure.DEFAULT_CLEF);
int keySignature = (measure != null ? measure.getKeySignature()
: TGMeasure.DEFAULT_KEY_SIGNATURE);
measures = getEmptyMeasures(segment.getHeaders().size(), clef,
keySignature);
}
for (int i = 0; i < measures.size(); i++) {
TGMeasure measure = (TGMeasure) measures.get(i);
measure.setHeader((TGMeasureHeader) headers.get(i));
this.sm.getMeasureManager().moveAllBeats(measure, move);
}
insertMeasures(currTrack, measures);
}
}
public void insertMeasures(TGTrack track, List<TGMeasure> measures) {
if (!measures.isEmpty()) {
for (final TGMeasure measure : measures) {
this.sm.getMeasureManager().removeNotesAfterString(measure,
track.stringCount());
this.sm.getTrackManager().addMeasure(track, (measure.getNumber() - 1),
measure);
}
}
}
public void replaceMeasures(TGSongSegment segment, long move, int track) {
boolean replaceHeader = (track == 0 || this.sm.getSong().countTracks() == 1);
List<TGMeasureHeader> measureHeaders = new ArrayList<TGMeasureHeader>();
this.sm.moveMeasureHeaders(segment.getHeaders(), move, 0, false);
for (final TGMeasureHeader header : segment.getHeaders()) {
TGMeasureHeader replace = (replaceHeader ? this.sm
.replaceMeasureHeader(header) : this.sm.getMeasureHeaderAt(header
.getStart()));
long nextStart = (replace.getStart() + replace.getLength());
for (final TGMeasureHeader next : this.sm.getMeasureHeadersAfter(replace
.getNumber())) {
this.sm.moveMeasureComponents(next, (nextStart - next.getStart()));
this.sm.moveMeasureHeader(next, (nextStart - next.getStart()), 0);
nextStart = (next.getStart() + next.getLength());
}
measureHeaders.add(replace);
}
for (final TGTrackSegment tSegment : segment.getTracks()) {
TGTrack currTrack = this.sm.getTrack((track > 0 && segment.getTracks()
.size() == 1) ? track : tSegment.getTrack());
if (currTrack != null) {
for (int i = 0; i < tSegment.getMeasures().size(); i++) {
TGMeasure measure = (TGMeasure) tSegment.getMeasures().get(i);
measure.setHeader((TGMeasureHeader) measureHeaders.get(i));
// this.sm.getMeasureManager().removeNotesAfterString(measure,
// currTrack.stringCount());
// this.sm.getMeasureManager().moveAllBeats(measure,move);
this.sm.getMeasureManager().moveAllBeats(measure, move);
this.sm.getMeasureManager().removeVoicesOutOfTime(measure);
this.sm.getMeasureManager().removeNotesAfterString(measure,
currTrack.stringCount());
this.sm.getTrackManager().replaceMeasure(currTrack, measure);
}
}
}
}
}