www.pudn.com > JSystemTrader.zip > DateScrollBar.java


/* 
 * ChartScrollBar.java 
 * 
 */ 
package com.jsystemtrader.chart; 
 
/** 
 * 
 */ 
import java.awt.event.*; 
import java.util.*; 
 
import javax.swing.*; 
 
import org.jfree.chart.axis.*; 
import org.jfree.chart.event.*; 
import org.jfree.chart.plot.*; 
import org.jfree.data.*; 
import org.jfree.data.xy.*; 
 
public class DateScrollBar extends JScrollBar implements AdjustmentListener, AxisChangeListener { 
    private static final int STEPS = 10000; 
 
    private final DateAxis dateAxis; 
    private final ValueAxis rangeAxis; 
    private final Range range; 
    private double rangeMin, rangeMax, dateRange, ratio; 
    private OHLCDataset dataset; 
 
    public DateScrollBar(XYPlot plot) { 
        super(HORIZONTAL); 
        dateAxis = (DateAxis) plot.getDomainAxis(); 
        rangeAxis = plot.getRangeAxis(); 
        range = plot.getDataRange(dateAxis); 
        dataset = (OHLCDataset) plot.getDataset(); 
        dateAxis.addChangeListener(this); 
        addAdjustmentListener(this); 
        axisChanged(null); 
        adjustmentValueChanged(null); 
    } 
 
 
    private void rangeUpdate() { 
        ArrayList xValues = new ArrayList (); 
        int count = dataset.getItemCount(0); 
        for (int item = 0; item < count; item++) { 
            xValues.add(dataset.getXValue(0, item)); 
        } 
 
        int firstItem = findItemIndex(xValues, dateAxis.getLowerBound(), count); 
        int lastItem = findItemIndex(xValues, dateAxis.getUpperBound(), count); 
 
        double max = dataset.getHighValue(0, firstItem); 
        double min = dataset.getLowValue(0, firstItem); 
        for (int item = firstItem; item <= lastItem; item++) { 
            double high = dataset.getHighValue(0, item); 
            if (high > max) { 
                max = high; 
            } 
 
            double low = dataset.getLowValue(0, item); 
            if (low < min) { 
                min = low; 
            } 
        } 
 
        rangeAxis.setRange(min, max); 
    } 
 
 
    public void axisChanged(AxisChangeEvent event) { 
        Timeline timeLine = dateAxis.getTimeline(); 
        rangeMin = timeLine.toTimelineValue( (long) range.getLowerBound()); 
        rangeMax = timeLine.toTimelineValue( (long) range.getUpperBound()); 
 
        long dateMin = timeLine.toTimelineValue( (long) dateAxis.getLowerBound()); 
        long dateMax = timeLine.toTimelineValue( (long) dateAxis.getUpperBound()); 
 
        dateRange = dateMax - dateMin; 
        ratio = STEPS / (rangeMax - rangeMin); 
 
        int newExtent = (int) (dateRange * ratio); 
        int newValue = (int) ( (dateMin - rangeMin) * ratio); 
 
        setValues(newValue, newExtent, 0, STEPS); 
    } 
 
 
    public void adjustmentValueChanged(AdjustmentEvent e) { 
        long start = (long) (getValue() / ratio + rangeMin); 
        long end = (long) (start + dateRange); 
 
        if (end > start) { 
            Timeline timeLine = dateAxis.getTimeline(); 
            start = timeLine.toMillisecond(start); 
            end = timeLine.toMillisecond(end); 
        } 
 
        dateAxis.setRange(start, end); 
        rangeUpdate(); 
    } 
 
 
    private int findItemIndex(ArrayList values, double value, int maxCount) { 
        int itemIndex = Collections.binarySearch(values, value); 
        if (itemIndex < 0) { 
            itemIndex = -itemIndex - 1; 
        } 
        itemIndex = Math.max(0, Math.min(itemIndex - 1, maxCount - 1)); 
        return itemIndex; 
    } 
 
 
}