/* * @(#)LongViewManager.java * * Copyright 2002 EGANTT LLP. All rights reserved. * PROPRIETARY/QPL. Use is subject to license terms. */ package com.egantt.drawing.view.manager; import java.math.BigDecimal; import com.egantt.drawing.view.ViewManager; import com.egantt.model.drawing.DrawingAxis; import com.egantt.model.drawing.axis.AxisView; import com.egantt.model.drawing.axis.interval.LongInterval; public class LongViewManager implements ViewManager { protected AxisView view; protected long center = Long.MAX_VALUE; /** treat MAX_VALUE as null */ // __________________________________________________________________________ public void setView(AxisView view) { this.view = view; } // __________________________________________________________________________ public DrawingAxis getAxis() { return view.getAxis(); } public AxisView getView() { return view; } // __________________________________________________________________________ public boolean setStart(Object start) { LongInterval visible = (LongInterval) view.getInterval(); long startValue = ((Long) start).longValue(); long range = ((Long) visible.getRange()).longValue(); // update the mid point this.center = startValue + (range / 2); return view.setVisible(new LongInterval(startValue, startValue + range)); } public boolean setFinish(Object finish) { LongInterval visible = (LongInterval) view.getInterval(); long finishValue = visible.getFinishValue(); long range = ((Long) visible.getRange()).longValue() / 2; // update the mid point this.center = range / 2; return view.setVisible(new LongInterval(finishValue - range, finishValue)); } // __________________________________________________________________________ public boolean translate(int x, boolean force) { LongInterval visible = (LongInterval) view.getInterval(); long range = visible.getRangeValue() /2; this.center = (center == Long.MAX_VALUE) ? range + visible.getStartValue(): this.center; long offset = 0; { BigDecimal result = new BigDecimal(Long.toString(range)); result = result.divide(new BigDecimal(Double.toString(50d))); result = result.multiply(new BigDecimal(Integer.toString(x))); offset = result.longValue(); } long startValue = center - range - offset; long finishValue = center + range + offset; if (force) { LongInterval interval = (LongInterval) getAxis().getInterval(); long s = interval.getStartValue(); long f = interval.getFinishValue(); finishValue += (s > startValue) ? s - startValue : 0; startValue -= (finishValue > f) ? finishValue -f : 0; startValue = Math.max(startValue, s); finishValue = Math.min(finishValue, f); } return view.setVisible(new LongInterval(startValue, finishValue)); } }