`
jay_kid
  • 浏览: 65068 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

diff tool

阅读更多
package processor;

public class Data {
	
	private String content;
	private int[] formatArray;

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public int[] getFormatArray() {
		return formatArray;
	}

	private void setFormatArray(int[] formatArray) {
		this.formatArray = formatArray;
	}
	
	public void setFormat(int index, int format) {
		formatArray[index] = format;
	}
	
	public int getFormat(int index) {
		return formatArray[index];
	}

	public static Data create(String contentString) {
		Data data = new Data();
		data.setContent(contentString);
		data.setFormatArray(new int[contentString.length()]);
		return data;
		
	}

}

 

 

package processor;

public class DiffProcessor {

	private static DiffProcessor instance;

	public static DiffProcessor getInstance() {
		if (instance == null) {
			instance = new DiffProcessor();
		}
		return instance;
	}

	public void process(Data data1, Data data2) {
		recursiveProcess(data1, 0, data1.getContent().length() - 1, data2, 0, data2.getContent().length() - 1);
	}

	private void copyArrayValue(int[] array1, int[] array2) {
		if (array1.length == array2.length) {
			for(int i = 0; i < array1.length; i++) {
				array1[i] = array2[i];
			}
		} else {
			return;
		}
	}

	private int[] LCS(String str1, int str1BeginIndex, int str1EndIndex, String str2, int str2BeginIndex, int str2EndIndex) {
		int arrayX = str1EndIndex - str1BeginIndex + 1;
		int arrayY = str2EndIndex - str2BeginIndex + 1;

		int[][] LCSArray = new int[2][arrayY];
		int maxValue = 0;
		int xMax = 0;
		int yMax = 0;
		for(int x = 0; x < arrayX; x++) {
			for(int y = 0; y < arrayY; y++) {
				if (str1.charAt(x + str1BeginIndex) == str2.charAt(y + str2BeginIndex)) {
					if (x > 0 && y > 0) {
						LCSArray[1][y] = LCSArray[0][y - 1] + 1;
						if (LCSArray[1][y] > maxValue) {
							maxValue = LCSArray[1][y];
							xMax = x;
							yMax = y;
						}
					} else {
						LCSArray[1][y] = 1;
					}
				} else {
					LCSArray[1][y] = 0;
				}
			}
			copyArrayValue(LCSArray[0], LCSArray[1]);
		}
		return new int[] { maxValue, xMax, yMax };
	}

	private void recursiveProcess(Data data1, int str1BeginIndex, int str1EndIndex, Data data2, int str2BeginIndex, int str2EndIndex) {

		int[] LCSResult = LCS(data1.getContent(), str1BeginIndex, str1EndIndex, data2.getContent(), str2BeginIndex, str2EndIndex);
		int maxValue = LCSResult[0];
		int xMax = LCSResult[1];
		int yMax = LCSResult[2];

		if (maxValue != 0) {

			int xSamePartStartIndex = str1BeginIndex + xMax - maxValue + 1;
			int xSamePartEndIndex = xSamePartStartIndex + maxValue - 1;
			int ySamePartStartIndex = str2BeginIndex + yMax - maxValue + 1;
			int ySamePartEndIndex = ySamePartStartIndex + maxValue - 1;

			for(int i = xSamePartStartIndex; i <= xSamePartEndIndex; i++) {
				data1.setFormat(i, 0);
			}
			for(int i = ySamePartStartIndex; i <= ySamePartEndIndex; i++) {
				data2.setFormat(i, 0);
			}

			if (xSamePartStartIndex - str1BeginIndex <= 0) {
				for(int i = str2BeginIndex; i < ySamePartStartIndex; i++) {
					data2.setFormat(i, 1);
				}
			} else if (ySamePartStartIndex - str2BeginIndex <= 0) {
				for(int i = str1BeginIndex; i < xSamePartStartIndex; i++) {
					data1.setFormat(i, 1);
				}
			} else {
				recursiveProcess(data1, str1BeginIndex, xSamePartStartIndex - 1, data2, str2BeginIndex, ySamePartStartIndex - 1);
			}

			if (str1EndIndex - xSamePartEndIndex <= 0) {
				for(int i = ySamePartEndIndex + 1; i <= str2EndIndex; i++) {
					data2.setFormat(i, 1);
				}
			} else if (str2EndIndex - ySamePartEndIndex <= 0) {
				for(int i = xSamePartEndIndex + 1; i <= str1EndIndex; i++) {
					data1.setFormat(i, 1);
				}
			} else {
				recursiveProcess(data1, xSamePartEndIndex + 1, str1EndIndex, data2, ySamePartEndIndex + 1, str2EndIndex);
			}

		} else {
			for(int i = str1BeginIndex; i <= str1EndIndex; i++) {
				data1.setFormat(i, 1);
			}
			for(int i = str2BeginIndex; i <= str2EndIndex; i++) {
				data2.setFormat(i, 1);
			}
			return;
		}
	}

}

 

 

 

package ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.WindowConstants;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

import processor.Data;
import processor.DiffProcessor;

public class DiffToolFrame extends JFrame {

	private MyJTextPane jTextPaneA;
	private MyJTextPane jTextPaneB;

	public DiffToolFrame() {

		VierMenuBar menuTest = new VierMenuBar();
		CenterPanel centerPanel = new CenterPanel();
		BottomPanel bottomPanel = new BottomPanel();

		this.setJMenuBar(menuTest);
		Container c = this.getContentPane();
		c.add(centerPanel, BorderLayout.CENTER);
		c.add(bottomPanel, BorderLayout.SOUTH);

		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		setSize(700, 500);
		setTitle("Diff Tool v1.0");
		setLocation(200, 150);
		setVisible(true);

		this.addWindowListener(new WindowAdapter() {
			public void WindowClosing(WindowEvent e) {
				dispose();
				System.exit(0);
			}
		});
	}

	class VierMenuBar extends JMenuBar {
		private JDialog aboutDialog;

		public VierMenuBar() {
			JMenu fileMenu = new JMenu("File");
			JMenuItem exitMenuItem = new JMenuItem("Exit", KeyEvent.VK_E);
			JMenuItem aboutMenuItem = new JMenuItem("About", KeyEvent.VK_A);

			this.add(fileMenu);
			fileMenu.add(exitMenuItem);
			fileMenu.add(aboutMenuItem);

			// about dialog
			Icon icon = new ImageIcon("smile.gif");
			JLabel aboutLabel = new JLabel("<html><b><font size=5>" + "<center>Diff Tool" + "<br>v1.0", icon, JLabel.CENTER);
			aboutDialog = new JDialog();
			aboutDialog.getContentPane().add(aboutLabel, BorderLayout.CENTER);
			aboutDialog.setSize(450, 225);
			aboutDialog.setLocation(300, 300);
			aboutDialog.setTitle("About");
			aboutDialog.addWindowListener(new WindowAdapter() {
				public void WindowClosing(WindowEvent e) {
					dispose();
				}
			});

			exitMenuItem.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					dispose();
					System.exit(0);
				}
			});

			aboutMenuItem.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					aboutDialog.setVisible(true);
				}
			});

		}

	}

	class CenterPanel extends JPanel {
		public CenterPanel() {
			jTextPaneA = new MyJTextPane();
			jTextPaneB = new MyJTextPane();

			JScrollPane jScrollPane1 = createJScrollPane(jTextPaneA);
			JScrollPane jScrollPane2 = createJScrollPane(jTextPaneB);

			JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jScrollPane1, jScrollPane2);
			this.setLayout(new BorderLayout());
			this.add(splitPane, BorderLayout.CENTER);
			this.setEnabled(true);
		}

		private JScrollPane createJScrollPane(MyJTextPane jTextPane) {
			jTextPane.setDocument(new DefaultStyledDocument());
			new DropTarget(jTextPane, DnDConstants.ACTION_COPY_OR_MOVE, jTextPane);
			JScrollPane jScrollPane = new JScrollPane();
			jScrollPane.setViewportView(jTextPane);
			return jScrollPane;

		}
	}

	class BottomPanel extends JPanel {
		public BottomPanel() {
			JButton compareButton = new JButton("Compare");
			compareButton.addActionListener(new ActionListener() {

				public void actionPerformed(ActionEvent e) {

					DefaultStyledDocument docA = (DefaultStyledDocument) jTextPaneA.getDocument();
					DefaultStyledDocument docB = (DefaultStyledDocument) jTextPaneB.getDocument();

					try {
						Data data1 = Data.create(docA.getText(0, docA.getLength()));
						Data data2 = Data.create(docB.getText(0, docB.getLength()));

						DiffProcessor dp = DiffProcessor.getInstance();
						dp.process(data1, data2);

						MutableAttributeSet diffAttr = new SimpleAttributeSet();
						MutableAttributeSet defaultAttr = new SimpleAttributeSet();
						StyleConstants.setForeground(diffAttr, Color.red);
						StyleConstants.setForeground(defaultAttr, Color.black);

						// set jTextPaneA
						for(int i = 0; i < data1.getFormatArray().length; i++) {
							if (data1.getFormat(i) == 1) {
								docA.setCharacterAttributes(i, 1, diffAttr, true);
							} else {
								docA.setCharacterAttributes(i, 1, defaultAttr, true);
							}
						}

						// set jTextPaneB
						for(int i = 0; i < data2.getFormatArray().length; i++) {
							if (data2.getFormat(i) == 1) {
								docB.setCharacterAttributes(i, 1, diffAttr, true);
							} else {
								docB.setCharacterAttributes(i, 1, defaultAttr, true);
							}
						}
					} catch (BadLocationException e1) {
						e1.printStackTrace();
					}

				}

			});
			this.setLayout(new BorderLayout());
			this.add(compareButton, BorderLayout.CENTER);
		}
	}

	public static void main(String args[]) {
		new DiffToolFrame();
	}
}

 

 

 

package ui;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.swing.JTextPane;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Document;

import util.MyUtil;

public class MyJTextPane extends JTextPane implements DropTargetListener {

	public MyJTextPane() {
		super();
	}

	@Override
	public void dragEnter(DropTargetDragEvent dtde) {
	}

	@Override
	public void dragExit(DropTargetEvent dte) {
	}

	@Override
	public void dragOver(DropTargetDragEvent dtde) {
	}

	@Override
	public void drop(DropTargetDropEvent dtde) {

		try {
			// clean JTextPane
			Document doc = this.getDocument();
			try {
				doc.remove(0, doc.getLength());
			} catch (BadLocationException e1) {
				e1.printStackTrace();
			}

			Transferable tr = dtde.getTransferable();
			if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
				dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
				List list = (List) (dtde.getTransferable().getTransferData(DataFlavor.javaFileListFlavor));
				Iterator iterator = list.iterator();
				while(iterator.hasNext()) {
					File f = (File) iterator.next();
					try {
						doc.insertString(0, MyUtil.readFile(f.getAbsolutePath()), null);
					} catch (BadLocationException e) {
						e.printStackTrace();
					}
				}
				dtde.dropComplete(true);
				// this.updateUI();
			} else {
				dtde.rejectDrop();
			}
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} catch (UnsupportedFlavorException ufe) {
			ufe.printStackTrace();
		}
	}

	@Override
	public void dropActionChanged(DropTargetDragEvent dtde) {
	}

}

 

 

 

package util;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class MyUtil {
	
	public static String readFile(String filePath) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(filePath));
		StringBuilder sb = new StringBuilder();
		String line;
		while((line = br.readLine()) != null) {
			sb.append(line).append("\n");
		}
		return sb.toString();

	}
	
	public static void main(String[] args) {
		try {
			System.out.println(readFile(""));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

 

分享到:
评论

相关推荐

    difftool纯净版

    《difftool纯净版——深度解析与应用指南》 difftool是一款强大的文件及代码比较工具,主要用于在版本控制系统如Git中对比不同版本之间的差异。它以“纯净版”形式出现,意味着没有捆绑任何第三方软件,提供了一个...

    difftool_src.zip

    标题中的“difftool_src.zip”表明这是一个包含源代码的压缩包,主要用于文件比较。从描述中我们可以了解到,这是用C++编程语言编写的,并且可以直接编译运行。标签“文件比较”和“c++”进一步确认了这个工具的主要...

    这个是比较工具diff_tool

    **diff_tool工具详解** 在IT行业中,文件比较是日常工作中不可或缺的一部分,特别是在代码审查、版本控制和文本编辑等场景。`diff_tool`是一款强大的文件对比工具,它可以帮助用户快速识别和理解两个或多个文件之间...

    difftool:nodejs diff模块,用于比较JSON或xml,在测试中尤其有用

    #difftool diff模块比较和比较JSON和XML 用法 $ npm install difftool --save var difftool = require('difftool'); difftool.diff(lhs,rhs,schema, options, function(result) { } lhs和rhs是要比较的两个对象...

    atom-git-difftool:在.gitconfig中配置的差异工具中打开当前项目

    Git Difftool 在.gitconfig中配置的差异工具中打开当前项目或文件。 基本上,它在当前项目上运行git difftool 。 用法 从命令面板运行Git Difftool: Diff File差异Git Difftool: Diff File ,或使用⌥⌃D差异当前...

    difftool:轻松区分将样式应用于任何一对DOM元素(chrome)

    difftool 这是chrome devtool扩展,用于轻松查看DOM两个元素之间的样式差异。 当我不得不在前端工作时,经常会发现自己手动滚动浏览应用于两个元素的样式,试图找出要应用的不同样式。 该工具会自动执行此操作。 ...

    webdiff:基于Web的两列git difftool

    基于Web的两列git difftool。 功能包括: 并排(两列)差异视图 在您选择的浏览器中的任何平台上运行。 通过Highlight.js突出显示语法 在单个差异中来回浏览多个文件 丰富的图像差异支持 安装 pip install ...

    git-difftool:围绕“git diff”的 Python 包装器,方便查看更改

    git-difftool 围绕“git diff”的 Python 包装器,方便查看更改 执照 在 Boost 软件许可下分发,版本 1.0。 (请参阅随附文件 LICENSE_1_0.txt 或复制到 ) 兼容性 需要 Git 1.7.2 或更高版本。 我在 cygwin 和 ...

    diffTool-CLI:这是一个CLI应用程序,可跟踪两个文件夹的内容和文件更改之间的更改

    **diffTool-CLI:文件夹内容与文件更改追踪利器** `diffTool-CLI` 是一个基于JavaScript开发的命令行界面(CLI)工具,专门用于跟踪和比较两个文件夹中的内容和文件之间的差异。在IT领域,这样的工具对于版本控制、...

    External diff Tool (Eclipse Plugin)-开源

    External diff Tool是一个Eclipse插件,它允许启动外部diff工具进行文件比较,而不是默认的内置Eclipse diff工具。 该插件不会替代内置的Eclipse工具。 它仅将一个新的菜单项添加到GUI。

    Show Diff Tool

    差分工具差分工具差分工具差分工具差分工具差分工具

    Git小技巧-指令别名及使用BeyondCompare作为差异比较工具

    例如,使用`git difftool`可以启动Beyond Compare比较工作区与暂存区、本地仓库之间的差异,而`git mergetool`则在合并冲突时发挥作用。在处理冲突时,Beyond Compare的界面清晰地展示了不同分支的内容,提供了多种...

    dmp:基于 google-diff-match-patch 工具的 Diff 工具

    difftool = true [diff] tool = dmp [difftool "dmp"] cmd = ~/path/to/dmp \"$LOCAL\" \"$REMOTE\" [alias] dd = difftool dc = difftool --cached sh = !"sh() { local c="$1"; c=${c:=HEAD}; git difftool ...

    elfdiff:简单的ELF difftool

    艾尔夫迪夫 一个简单的ELF文件差异工具! USAGE: elfdiff &lt;ELF&gt; FLAGS: -h, --help Prints help information -V, --version Prints version information ARGS: &lt;ELF&gt; First ELF &lt;ELF&gt; Second ELF ...

    如何使用git.pdf

    - 类似于difftool的配置过程,但主要用于解决合并冲突。 - 命令示例: - A: `git config --global merge.tool bcompare` - B: `git config --global merge.tool meld` - 使用`git mergetool`解决合并过程中产生...

    Another PostgreSQL Diff Tool-开源

    独立于平台的PostgreSQL差异工具,可用于架构升级。 该工具比较两个架构转储文件,并创建可用于升级旧架构的输出文件。 项目资源和问题跟踪程序已移至https://github.com/fordfrog/apgdiff。

    SEORadar Diff tool-crx插件

    语言:English (United States) 免费的SEO差异工具 这使用户可以针对任何2个URL进行SEO元素的源代码和结构化比较。 这对于比较以下内容特别有用:*登台URL与生产URL –发行前测试*移动设备与台式机-*提取与呈现-查看...

    diffsitter:基于树的AST difftool,以获得有意义的语义差异

    diffsitter使用AST对文本文件执行diff来计算差异,而不是使用基于朴素的基于文本的差异。 这可以为您提供更多语义上有意义的差异信息,例如,这可以防止差异被格式差异污染。 diffstter使用 diffstter项目中的解析...

    difftool

    Create React App入门该项目是通过。可用脚本在项目目录中,可以运行:npm start 在开发模式下运行应用程序。 打开在浏览器中查看。 如果进行编辑,页面将重新加载。 您还将在控制台中看到任何棉绒错误。...

    Delta - code inspection and diff tool-开源

    源代码差异工具。 改编自cvsweb,它使代码检查变得容易。 它还提供了另一个差异工具,您可以使用该工具递归比较两个文件或两个目录。 它是用perl编写的,并使用String :: Ediff进行比较。

Global site tag (gtag.js) - Google Analytics