package org.jmeld.ui.tree;
import org.jmeld.JMeldException;
import org.jmeld.diff.JMChunk;
import org.jmeld.diff.JMDelta;
import org.jmeld.diff.JMDiff;
import org.jmeld.diff.JMRevision;
import org.jmeld.settings.JMeldSettings;
import org.jmeld.util.Ignore;
import org.jmeld.vc.util.VcCmd;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import java.awt.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;
/**
* Diff tree panel
* User: alberto
* Date: 29/01/13
* Time: 0:06
*/
public class DiffTree extends JTree {
public DiffTree() {
this(new DefaultTreeModel(new DefaultMutableTreeNode(null)));
}
public DiffTree(JMRevision revision) {
this(buildTreemodel(revision));
}
public DiffTree(DefaultTreeModel model) {
super(model);
setCellRenderer(new DiffTreeCellRenderer());
}
private static DefaultTreeModel buildTreemodel(JMRevision revision) {
DefaultMutableTreeNode root = new DefaultMutableTreeNode(revision);
if (JMeldSettings.getInstance().getEditor().isShowTreeRaw()) {
addRawNodes(revision, root);
} else {
addNodes(revision, root);
}
return new DefaultTreeModel(root);
}
private static void addNodes(JMRevision revision, DefaultMutableTreeNode root) {
if (revision != null) {
for (JMDelta delta : revision.getDeltas()) {
int initLine = delta.getOriginal().getAnchor();
int numLines = delta.getRevised().getSize();
JMRevision changeRevision = delta.getChangeRevision();
for (JMDelta changeDelta : changeRevision.getDeltas()) {
JMChunk orgChunk = changeDelta.getOriginal();
JMChunk revChunk = changeDelta. getRevised();
int startCol = orgChunk.getAnchor();
int endCol = revChunk.getAnchor();
int modifiedchars = revChunk.getSize() - orgChunk.getSize();
JMChunkNode orgNode = new JMChunkNode(orgChunk, changeRevision.getOriginalString(orgChunk));
JMChunkNode revNode = new JMChunkNode(revChunk, changeRevision.getRevisedString(revChunk));
DefaultMutableTreeNode childDelta = new DefaultMutableTreeNode(changeDelta);
childDelta.add(orgNode);
childDelta.add(revNode);
JMChange change = new JMChange(initLine, numLines, startCol, endCol, modifiedchars);
DefaultMutableTreeNode changeNode = new DefaultMutableTreeNode(change);
changeNode.add(childDelta);
root.add(changeNode);
}
}
}
}
private static void addRawNodes(JMRevision revision, DefaultMutableTreeNode parent) {
if (revision != null) {
for (JMDelta delta : revision.getDeltas()) {
DefaultMutableTreeNode deltaNode = buildDeltaNode(delta, revision);
JMRevision changeRevision = delta.getChangeRevision();
for (JMDelta changeDelta : changeRevision.getDeltas()) {
DefaultMutableTreeNode changeDeltaNode = buildDeltaNode(changeDelta, changeRevision);
deltaNode.add(changeDeltaNode);
}
parent.add(deltaNode);
}
}
}
private static DefaultMutableTreeNode buildDeltaNode(JMDelta delta, JMRevision revision) {
JMChunk orgChunk = delta.getOriginal();
JMChunk revChunk = delta.getRevised();
DefaultMutableTreeNode deltaNode = new JMDeltaNode(delta);
deltaNode.add(new JMChunkNode(orgChunk, revision.getOriginalString(orgChunk)));
deltaNode.add(new JMChunkNode(revChunk, revision.getRevisedString(revChunk)));
return deltaNode;
}
public void setRevision(JMRevision revision) {
setModel(buildTreemodel(revision));
}
public static void main(String[] args) throws IOException, JMeldException {
File file = VcCmd.parseFile(args, 0);
if (file == null) {
return;
}
File file2 = VcCmd.parseFile(args, 1);
if (file2 == null) {
return;
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(new Dimension(400, 300));
BufferedReader readerOrg = new BufferedReader(new FileReader(file));
String line;
Vector<String> vOrg = new Vector<String>();
while ((line = readerOrg.readLine()) != null) {
vOrg.add(line);
}
BufferedReader readerRev = new BufferedReader(new FileReader(file2));
Vector<String> vRev = new Vector<String>();
while ((line = readerRev.readLine()) != null) {
vRev.add(line);
}
JMRevision revision = new JMDiff().diff(vOrg.toArray(), vRev.toArray(), Ignore.NULL_IGNORE);
JTree tree = new DiffTree(buildTreemodel(revision));
frame.add(new JScrollPane(tree));
frame.pack();
frame.setVisible(true);
}
}