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); } } }