/*
* Created on 04-ene-2006
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package org.herac.tuxguitar.graphics.control;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.herac.tuxguitar.graphics.TGPainter;
import org.herac.tuxguitar.graphics.TGRectangle;
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 TGLayoutVertical extends TGLayout{
private int maximumWidth;
private int marginLeft;
private int marginRight;
public TGLayoutVertical(TGController controller,int style){
super(controller,style);
}
@Override
public int getMode(){
return MODE_VERTICAL;
}
@Override
public void paintSong(TGPainter painter,TGRectangle clientArea,int fromX,int fromY) {
this.marginLeft = getFirstMeasureSpacing();
this.marginRight = 10;
this.maximumWidth = (clientArea.getWidth() - (this.marginLeft + this.marginRight));
this.setHeight(0);
this.setWidth(0);
this.clearTrackPositions();
int style = getStyle();
int number = getComponent().getTrackSelection();
int posY = fromY + getFirstTrackSpacing();
int height = getFirstTrackSpacing();
int lineHeight = 0;
int measureCount = getSongManager().getSong().countMeasureHeaders();
int nextMeasureIndex = 0;
while(measureCount > nextMeasureIndex){
TempLine line = null;
Iterator tracks = getSongManager().getSong().getTracks();
while(tracks.hasNext()){
TGTrackImpl track = (TGTrackImpl) tracks.next();
if(number < 0 || track.getNumber() == number){
TGTrackSpacing ts = new TGTrackSpacing(this) ;
ts.setSize(TGTrackSpacing.POSITION_SCORE_MIDDLE_LINES, ((style & DISPLAY_SCORE) != 0 ?( (getScoreLineSpacing() * 5) ):0));
if(nextMeasureIndex == 0){
((TGLyricImpl)track.getLyrics()).start();
}
line = getTempLines(track,nextMeasureIndex,ts);
if( (style & DISPLAY_SCORE) != 0 ){
ts.setSize(TGTrackSpacing.POSITION_SCORE_UP_LINES, Math.abs(line.minY));
if(line.maxY > track.getScoreHeight()){
ts.setSize(TGTrackSpacing.POSITION_SCORE_DOWN_LINES, (line.maxY - track.getScoreHeight()) );
}
}
if((style & DISPLAY_TABLATURE) != 0){
ts.setSize(TGTrackSpacing.POSITION_TABLATURE_TOP_SEPARATOR, ((style & DISPLAY_SCORE) != 0 ? getMinScoreTabSpacing() : Math.max(Math.abs(line.minY), getStringSpacing()) ));
ts.setSize(TGTrackSpacing.POSITION_TABLATURE, ((style & DISPLAY_SCORE) != 0 ? track.getTabHeight() + getStringSpacing() + 1 : Math.max( line.maxY, track.getTabHeight() + getStringSpacing() + 1) ));
}
ts.setSize(TGTrackSpacing.POSITION_LYRIC,10);
checkDefaultSpacing(ts);
paintLine(track,line,painter,fromX,posY,ts,clientArea);
lineHeight = ts.getSize();
addTrackPosition(track.getNumber(),posY,lineHeight);
int emptyX = (this.marginLeft + fromX + line.tempWith + 2);
int emptyWith = ( this.maximumWidth - emptyX );
if((emptyWith - 20) > 0 && (line.lastIndex + 1) >= measureCount){
if(emptyX < (clientArea.getX() + clientArea.getWidth())){
emptyX = (emptyX < clientArea.getX() ? clientArea.getX() :emptyX);
emptyWith = ( emptyWith > clientArea.getWidth() ? clientArea.getWidth() : emptyWith );
paintLines(track,ts,painter, emptyX ,posY, emptyWith);
}
}
posY += lineHeight + getTrackSpacing();
height += lineHeight + getTrackSpacing();
}
}
if(line != null){
nextMeasureIndex = line.lastIndex + 1;
}
}
this.setHeight(height);
this.setWidth( getWidth() + this.marginRight );
}
public void paintLine(TGTrackImpl track,TempLine line,TGPainter painter,int fromX, int fromY,TGTrackSpacing ts,TGRectangle clientArea) {
int posX = (this.marginLeft + fromX);
int posY = fromY;
int width = this.marginLeft;
//verifico si esta en el area de cliente
boolean isAtY = (posY + ts.getSize() > clientArea.getY() && posY < clientArea.getY() + clientArea.getHeight() + 80);
int measureSpacing = 0;
if(line.fullLine){
int diff = ( this.maximumWidth - line.tempWith);
if(diff != 0 && line.measures.size() > 0){
measureSpacing = diff / line.measures.size();
}
}
for(int i = 0;i < line.measures.size();i ++){
int index = ((Integer)line.measures.get(i)).intValue();
TGMeasureImpl currMeasure = (TGMeasureImpl)track.getMeasure(index);
//asigno la posicion dentro del compas
currMeasure.setPosX(posX);
currMeasure.setPosY(posY);
currMeasure.setTs(ts);
((TGLyricImpl)track.getLyrics()).setCurrentMeasure(currMeasure);
currMeasure.setFirstOfLine(i == 0);
int measureWidth = ( currMeasure.getWidth(this) + measureSpacing );
boolean isAtX = ( posX + measureWidth > clientArea.getX() && posX < clientArea.getX() + clientArea.getWidth());
if(isAtX && isAtY){
paintMeasure(currMeasure,painter,measureSpacing);
((TGLyricImpl)track.getLyrics()).paintCurrentNoteBeats(painter,this,currMeasure,posX, posY);
}else{
currMeasure.setOutOfBounds(true);
}
posX += measureWidth;
width += measureWidth;
}
this.setWidth(Math.max(getWidth(),width));
}
public TempLine getTempLines(TGTrack track,int fromIndex,TGTrackSpacing ts) {
int style = getStyle();
TempLine line = new TempLine();
line.maxY = 0;
line.minY = 0;
// Need to score extra-lines in edition mode
if( (style & DISPLAY_TABLATURE) == 0 && (style & DISPLAY_SCORE) != 0 ){
line.maxY = ((getScoreLineSpacing() * 4) + (getScoreLineSpacing() * 4));
line.minY = -(getScoreLineSpacing() * 3);
}
int measureCount = track.countMeasures();
for (int measureIdx = fromIndex; measureIdx < measureCount; measureIdx++) {
TGMeasureImpl measure = (TGMeasureImpl)track.getMeasure(measureIdx);
//verifico si tengo que bajar de linea
if((line.tempWith + measure.getWidth(this)) >= this.maximumWidth && !line.measures.isEmpty()){
line.fullLine = true;
return line;
}
line.tempWith += measure.getWidth(this);
line.maxY = (measure.getMaxY() > line.maxY)?measure.getMaxY():line.maxY;
line.minY = (measure.getMinY() < line.minY)?measure.getMinY():line.minY;
line.addMeasure(measureIdx);
measure.registerSpacing(this,ts);
}
return line;
}
private class TempLine{
protected int tempWith;
protected int lastIndex;
protected boolean fullLine;
protected int maxY = 0;
protected int minY = 0;
protected List measures;
public TempLine(){
this.measures = new ArrayList();
}
protected void addMeasure(int index){
this.measures.add(new Integer(index));
this.lastIndex = index;
}
}
}