/*
 *                    BioJava development code
 *
 * This code may be freely distributed and modified under the
 * terms of the GNU Lesser General Public Licence.  This should
 * be distributed with the code.  If you do not have a copy,
 * see:
 *
 *      http://www.gnu.org/copyleft/lesser.html
 *
 * Copyright for this code is held jointly by the individual
 * authors.  These should be listed in @author doc comments.
 *
 * For more information on the BioJava project and its aims,
 * or to join the biojava-l mailing list, visit the home page
 * at:
 *
 *      http://www.biojava.org/
 *
 */
package org.biojava.bio.gui.sequence.tracklayout;

import org.biojava.bio.seq.*;
import org.biojava.bio.symbol.*;


/**
 * A TrackLayout implenentation that wraps the sequence smoothly after a set number of residues
 *
 * @author Mark Southern
 * @since 1.5
 */
public class SimpleTrackLayout implements TrackLayout {
    private Sequence seq;
    private RangeLocation loc;
    private int wrap = 50;
    private int wrapInc = 10;

    public SimpleTrackLayout() {
    }

    public SimpleTrackLayout(Sequence seq, int wrap) {
        setSequence(seq);
        setWrap(wrap);
    }

    public void setSequence(Sequence seq) {
        this.seq = seq;
    }

    public void setRange(RangeLocation loc) {
        this.loc = loc;
    }

    public RangeLocation[] getRanges() {
        int min = loc.getMin();
        int max = loc.getMax();

        int rowCount = ( int ) Math.ceil((( double ) (max - min + 1)) / (( double ) wrap));
        RangeLocation[] ranges = new RangeLocation[ rowCount ];

        int count = 0;

        for (int i = min; i <= max; i += wrap) {
            int newMax = (i + wrap) - 1;

            if (newMax > max) {
                newMax = max;
            }

            RangeLocation loc = new RangeLocation(i, newMax);
            ranges[ count++ ] = loc;
        }

        return ranges;
    }

    public void setWrap(int wrap) {
        this.wrap = wrap;
    }

    public int getWrap() {
        return wrap;
    }

    public int getWrapIncrement() {
        return wrapInc;
    }

    public void setWrapIncrement(int inc) {
        wrapInc = inc;
    }
}
