/** * Copyright (C) 2009, 2010 SC 4ViewSoft SRL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.androsz.achartengine.tools; import android.graphics.PointF; import com.androsz.achartengine.chart.XYChart; /** * The pan tool. */ public class Pan extends AbstractTool { /** * Builds and instance of the pan tool. * * @param chart * the XY chart */ public Pan(XYChart chart) { super(chart); } /** * Apply the tool. * * @param oldX * the previous location on X axis * @param oldY * the previous location on Y axis * @param newX * the current location on X axis * @param newY * the current location on the Y axis */ public void apply(float oldX, float oldY, float newX, float newY) { final double[] range = getRange(); final double[] limits = mRenderer.getPanLimits(); final boolean limited = limits != null && limits.length == 4; final double[] calcRange = mChart.getCalcRange(); if (range[0] == range[1] && calcRange[0] == calcRange[1] || range[2] == range[3] && calcRange[2] == calcRange[3]) return; checkRange(range); final PointF realPoint = mChart.toRealPoint(oldX, oldY); final PointF realPoint2 = mChart.toRealPoint(newX, newY); final double deltaX = realPoint.x - realPoint2.x; final double deltaY = realPoint.y - realPoint2.y; if (mRenderer.isPanXEnabled()) { if (limited) { if (limits[0] > range[0] + deltaX) { setXRange(limits[0], limits[0] + (range[1] - range[0])); } else if (limits[1] < range[1] + deltaX) { setXRange(limits[1] - (range[1] - range[0]), limits[1]); } else { setXRange(range[0] + deltaX, range[1] + deltaX); } } else { setXRange(range[0] + deltaX, range[1] + deltaX); } } if (mRenderer.isPanYEnabled()) { if (limited) { if (limits[2] > range[2] + deltaY) { setYRange(limits[2], limits[2] + (range[3] - range[2])); } else if (limits[3] < range[3] + deltaY) { setYRange(limits[3] - (range[3] - range[2]), limits[3]); } else { setYRange(range[2] + deltaY, range[3] + deltaY); } } else { setYRange(range[2] + deltaY, range[3] + deltaY); } } } }