/* JMeld is a visual diff and merge tool. Copyright (C) 2007 Kees Kuip This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package org.jmeld.util; import org.jmeld.diff.*; import org.jmeld.ui.*; import java.io.*; public class DiffUtil { public static boolean debug = false; public static int getRevisedLine(JMRevision revision, int originalLine) { JMDelta delta; int originalAnchor; int originalSize; int revisedAnchor; int revisedSize; int revisedLine; if (revision == null) { return 0; } revisedLine = originalLine; delta = findOriginalDelta(revision, originalLine); if (delta != null) { originalAnchor = delta.getOriginal().getAnchor(); originalSize = delta.getOriginal().getSize(); revisedAnchor = delta.getRevised().getAnchor(); revisedSize = delta.getRevised().getSize(); if (originalLine - originalAnchor < originalSize) { revisedLine = revisedAnchor; } else { revisedLine = revisedAnchor + revisedSize - originalSize + (originalLine - originalAnchor); } } else { originalAnchor = 0; originalSize = 0; revisedAnchor = 0; revisedSize = 0; } if (debug) { System.out.printf("%03d-%02d, %03d-%02d == ", originalAnchor, originalSize, revisedAnchor, revisedSize); } return revisedLine; } public static int getOriginalLine(JMRevision revision, int revisedLine) { JMDelta delta; int originalAnchor; int originalSize; int revisedAnchor; int revisedSize; int originalLine; originalLine = revisedLine; delta = findRevisedDelta(revision, revisedLine); if (delta != null) { originalAnchor = delta.getOriginal().getAnchor(); originalSize = delta.getOriginal().getSize(); revisedAnchor = delta.getRevised().getAnchor(); revisedSize = delta.getRevised().getSize(); if (revisedLine - revisedAnchor < revisedSize) { originalLine = originalAnchor; } else { originalLine = originalAnchor + originalSize - revisedSize + (revisedLine - revisedAnchor); } } else { originalAnchor = 0; originalSize = 0; revisedAnchor = 0; revisedSize = 0; } if (debug) { System.out.printf("%03d-%02d, %03d-%02d == ", originalAnchor, originalSize, revisedAnchor, revisedSize); } return originalLine; } private static JMDelta findOriginalDelta(JMRevision revision, int line) { return findDelta(revision, line, true); } private static JMDelta findRevisedDelta(JMRevision revision, int line) { return findDelta(revision, line, false); } private static JMDelta findDelta(JMRevision revision, int line, boolean originalDelta) { JMDelta previousDelta; int anchor; if (revision == null) { return null; } previousDelta = null; for (JMDelta delta : revision.getDeltas()) { if (originalDelta) { anchor = delta.getOriginal().getAnchor(); } else { anchor = delta.getRevised().getAnchor(); } if (anchor > line) { break; } previousDelta = delta; } return previousDelta; } }