package org.herac.tuxguitar.gui.editors.tab;
import org.herac.tuxguitar.gui.editors.tab.layout.ViewLayout;
import org.herac.tuxguitar.song.models.TGMeasureHeader;
public class TGMeasureHeaderImpl extends TGMeasureHeader {
/**
* Espacio por defecto a la izquierda
*/
private static final int DEFAULT_LEFT_SPACING = 15;
/**
* Espacio por defecto a la derecha
*/
private static final int DEFAULT_RIGHT_SPACING = 15;
/**
* Espacio por defecto del timeSignature
*/
private static final int DEFAULT_TIME_SIGNATURE_SPACING = 30;
private static final int PAINT_TEMPO = 0x01;
private static final int PAINT_TIME_SIGNATURE = 0x04;
private static final int PAINT_TRIPLET_FEEL = 0x02;
private int maxClefSpacing;
private int maxKeySignatureSpacing;
private int maxQuarterSpacing;
private int maxWidth;
private int paintFlags;
public void calculateMeasureChanges(ViewLayout layout) {
TGMeasureHeader previous = layout.getSongManager().getPrevMeasureHeader(
this);
if (previous == null) {
this.paintFlags |= PAINT_TEMPO;
this.paintFlags |= ((this.getTripletFeel() != TGMeasureHeader.TRIPLET_FEEL_NONE) ? PAINT_TRIPLET_FEEL
: 0);
this.paintFlags |= PAINT_TIME_SIGNATURE;
} else {
// Tempo
if (this.getTempo().getValue() != previous.getTempo().getValue()) {
this.paintFlags |= PAINT_TEMPO;
}
// Triplet Feel
if (this.getTripletFeel() != previous.getTripletFeel()) {
this.paintFlags |= PAINT_TRIPLET_FEEL;
}
// Time Signature
int thisNumerator = this.getTimeSignature().getNumerator();
int thisValue = this.getTimeSignature().getDenominator().getValue();
int prevNumerator = previous.getTimeSignature().getNumerator();
int prevValue = previous.getTimeSignature().getDenominator().getValue();
if (thisNumerator != prevNumerator || thisValue != prevValue) {
this.paintFlags |= PAINT_TIME_SIGNATURE;
}
}
}
public int getClefSpacing(ViewLayout layout, TGMeasureImpl measure) {
return (!measure.isPaintClef()
&& (layout.getStyle() & ViewLayout.DISPLAY_MULTITRACK) == 0 ? 0
: this.maxClefSpacing);
}
public int getFirstNoteSpacing(ViewLayout layout, TGMeasureImpl measure) {
int topSpacing = getTempoSpacing(layout) + getTripletFeelSpacing(layout);
int middleSpacing = getClefSpacing(layout, measure)
+ getKeySignatureSpacing(layout, measure)
+ getTimeSignatureSpacing(layout);
return Math.round(Math.max(topSpacing, middleSpacing)
+ (10f * layout.getScale()));
}
public int getKeySignatureSpacing(ViewLayout layout, TGMeasureImpl measure) {
return (!measure.isPaintKeySignature()
&& (layout.getStyle() & ViewLayout.DISPLAY_MULTITRACK) == 0 ? 0
: this.maxKeySignatureSpacing);
}
public int getLeftSpacing(ViewLayout layout) {
return Math.round(DEFAULT_LEFT_SPACING * layout.getScale());
}
public int getMaxQuarterSpacing() {
return this.maxQuarterSpacing;
}
public int getMaxWidth() {
return this.maxWidth;
}
public int getRightSpacing(ViewLayout layout) {
return Math.round(DEFAULT_RIGHT_SPACING * layout.getScale());
}
public int getTempoSpacing(ViewLayout layout) {
return (shouldPaintTempo() ? Math.round(45 * layout.getScale()) : 0);
}
public int getTimeSignatureSpacing(ViewLayout layout) {
return (shouldPaintTimeSignature() ? Math
.round(DEFAULT_TIME_SIGNATURE_SPACING * layout.getScale()) : 0);
}
public int getTripletFeelSpacing(ViewLayout layout) {
return (shouldPaintTripletFeel() ? Math.round(55 * layout.getScale()) : 0);
}
public void notifyClefSpacing(int spacing) {
this.maxClefSpacing = ((spacing > this.maxClefSpacing) ? spacing
: this.maxClefSpacing);
}
public void notifyKeySignatureSpacing(int spacing) {
this.maxKeySignatureSpacing = ((spacing > this.maxKeySignatureSpacing) ? spacing
: this.maxKeySignatureSpacing);
}
public void notifyQuarterSpacing(int spacing) {
this.maxQuarterSpacing = ((spacing > this.maxQuarterSpacing) ? spacing
: this.maxQuarterSpacing);
}
public void notifyWidth(int width) {
this.maxWidth = ((width > this.maxWidth) ? width : this.maxWidth);
}
public void reset() {
this.maxWidth = 0;
this.paintFlags = 0;
this.maxQuarterSpacing = 0;
this.maxClefSpacing = 0;
this.maxKeySignatureSpacing = 0;
}
public boolean shouldPaintTempo() {
return ((this.paintFlags & PAINT_TEMPO) != 0);
}
public boolean shouldPaintTimeSignature() {
return ((this.paintFlags & PAINT_TIME_SIGNATURE) != 0);
}
public boolean shouldPaintTripletFeel() {
return ((this.paintFlags & PAINT_TRIPLET_FEEL) != 0);
}
public void update(ViewLayout layout, int index) {
this.reset();
this.calculateMeasureChanges(layout);
int trackCount = getSong().countTracks();
for (int trackIdx = 0; trackIdx < trackCount; trackIdx++) {
TGTrackImpl track = (TGTrackImpl) getSong().getTrack(trackIdx);
TGMeasureImpl measure = (TGMeasureImpl) track.getMeasure(index);
measure.calculateMeasureChanges(layout);
}
}
}