diff Viewer

diffViewer

Const.java
package constData;

public class Const {

final public static int STR_ARRAY_A = 0;
final public static int STR_ARRAY_B = 1;
}


DiffProcessor.java
package processor;

public class DiffProcessor {

final public static int CHAR_SAME=0;
final public static int CHAR_DIFFERENT=1;
final public static int STR_1_ARRAY = 0;
final public static int STR_2_ARRAY = 1;

private String str1;
private String str2;

private int[] str1Array;
private int[] str2Array;

public DiffProcessor(){
super();
}

public DiffProcessor(String str1,String str2){
init(str1, str2);
}

private void init(String str1, String str2) {
this.str1 = str1;
this.str2 = str2;
str1Array = new int[str1.length()];
str2Array = new int[str2.length()];
}

public void reSetString(String str1, String str2){
init(str1,str2);
}

public int[][] process(){
LCS(0,str1.length()-1, 0, str2.length()-1);
int[][] rInt = new int[2][];
rInt[STR_1_ARRAY] = this.str1Array;
rInt[STR_2_ARRAY] = this.str2Array;
return rInt;

}


private static 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 void LCS(int str1BeginIndex, int str1EndIndex, int str2BeginIndex, int str2EndIndex){
// System.out.println("$$$$$$$$$$$$$$$$$$$Enter$$$$$$$$$$$$$$$$$");
// System.out.println("Comming Index str1BeginIndex=" + str1BeginIndex);
// System.out.println("Comming Index str1EndIndex =" + str1EndIndex);
// System.out.println("Comming Index str2BeginIndex=" + str2BeginIndex);
// System.out.println("Comming Index str2EndIndex =" + 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;
}
// System.out.print(LCSArray[1][y]);
}
copyArrayValue(LCSArray[0], LCSArray[1]);
//LCSArray[0] = LCSArray[1];
// System.out.println();
}
if (maxValue != 0){
// System.out.println("xMax:" + xMax);
// System.out.println("yMax:" + yMax);
// System.out.println("maxValue:" + maxValue);
// System.out.println("yMax-maxValue+1,yMax+1:" + str2.substring(yMax-maxValue+1,yMax+1));
//return str1.substring(xMax-maxValue+1, xMax+1);

// for the same part, mark str1Array and str2Array corresponding part to 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++){
str1Array[i]=0;
}
for (int i = ySamePartStartIndex; i <= ySamePartEndIndex; i++){
str2Array[i]=0;
}


// for the difference part including pre-diff and post-diff, continue use LCS() to find out the same part;
// System.out.println("xSamePartStartIndex:" + xSamePartStartIndex);
// System.out.println("xSamePartEndIndex:" + xSamePartEndIndex);
// System.out.println("ySamePartStartIndex:" + ySamePartStartIndex);
// System.out.println("ySamePartEndIndex:" + ySamePartEndIndex);
// System.out.println("==========================================");
// System.out.println("xSamePartStartIndex - str1BeginIndex:" + (xSamePartStartIndex - str1BeginIndex));
// System.out.println("str1EndIndex - xSamePartEndIndex:" + (str1EndIndex - xSamePartEndIndex));
// System.out.println("ySamePartStartIndex - str2BeginIndex:" + (ySamePartStartIndex - str2BeginIndex));
// System.out.println("str2EndIndex - ySamePartEndIndex:" + (str2EndIndex - ySamePartEndIndex));
if (xSamePartStartIndex - str1BeginIndex <= 0){
for (int i = str2BeginIndex; i<ySamePartStartIndex; i++){
str2Array[i] = 1;
}
} else if (ySamePartStartIndex - str2BeginIndex <= 0){
for (int i = str1BeginIndex; i<xSamePartStartIndex; i++){
str1Array[i] = 1;
}
} else {
LCS(str1BeginIndex, xSamePartStartIndex-1, str2BeginIndex, ySamePartStartIndex-1 );
}

if (str1EndIndex - xSamePartEndIndex <=0){
for (int i = ySamePartEndIndex+1; i<=str2EndIndex; i++){
str2Array[i] = 1;
}
} else if(str2EndIndex - ySamePartEndIndex <=0){
for (int i = xSamePartEndIndex+1; i<=str1EndIndex; i++){
str1Array[i] = 1;
}
} else {
LCS(xSamePartEndIndex+1, str1EndIndex, ySamePartEndIndex+1, str2EndIndex);
}

} else {
// System.out.println("===There are no any same part between===" );
// System.out.println("String A:" + str1.substring(str1BeginIndex, str1EndIndex+1));
// System.out.println("String B:" + str2.substring(str2BeginIndex, str2EndIndex+1));
//for the different part, mark str1Array and str2Array corresponding part to 1
for (int i = str1BeginIndex; i <= str1EndIndex; i++){
str1Array[i]=1;
}
for (int i = str2BeginIndex; i <= str2EndIndex; i++){
str2Array[i]=1;
}
return;
}
}


}


ProcessorManager.java
package processor;

public class ProcessorManager {

public static ProcessorManager processorManager;
private DiffProcessor diffProcessor;

public DiffProcessor getDiffProcessor() {
return diffProcessor;
}

public void setDiffProcessor(DiffProcessor diffProcessor) {
this.diffProcessor = diffProcessor;
}

public static synchronized ProcessorManager getInstance(){
if (processorManager == null){
processorManager = new ProcessorManager();
}
return processorManager;
}

}


UIManager.java
package ui;

import java.awt.Color;

import javax.swing.JTextPane;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;

public class UIManager {
private static UIManager uiManager;
public static synchronized UIManager getInstance(){
if (uiManager == null){
uiManager = new UIManager();
}
return uiManager;
}
private JTextPane jTextPaneA;
private JTextPane jTextPaneB;

MutableAttributeSet diffAttr;
MutableAttributeSet defaultAttr;

public UIManager(){
iniAttr();
}

public void iniAttr(){
diffAttr = new SimpleAttributeSet();
defaultAttr = new SimpleAttributeSet();
StyleConstants.setForeground(diffAttr, Color.red);
StyleConstants.setForeground(defaultAttr, Color.black);
}

public MutableAttributeSet getDefaultAttr() {
return defaultAttr;
}

public void setDefaultAttr(MutableAttributeSet defaultAttr) {
this.defaultAttr = defaultAttr;
}

public MutableAttributeSet getDiffAttr() {
return diffAttr;
}

public JTextPane getJTextPaneA() {
return jTextPaneA;
}
public JTextPane getJTextPaneB() {
return jTextPaneB;
}
public void setDiffAttr(MutableAttributeSet diffAttr) {
this.diffAttr = diffAttr;
}
public void setJTextPaneA(JTextPane textPaneA) {
jTextPaneA = textPaneA;
}
public void setJTextPaneB(JTextPane textPaneB) {
jTextPaneB = textPaneB;
}

}


ViewerFrame.java
package ui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.BoundedRangeModel;
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.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.Timer;
import javax.swing.WindowConstants;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Document;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;

import constData.Const;

import processor.DiffProcessor;
import processor.ProcessorManager;


public class ViewerFrame extends JFrame{

private JTextPane jTextPaneA;
private JTextPane jTextPaneB;

public ViewerFrame()
{

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


Container c = this.getContentPane();
// c.setLayout(new BorderLayout())
this.setJMenuBar(menuTest);

c.add(centerPanel,BorderLayout.CENTER);
c.add(bottomPanel,BorderLayout.SOUTH);

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


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


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);

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

this.add(fileMenu);


aboutDialog = new JDialog();
initAboutDialog();

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);
}
});

}

public JDialog getAboutDialog()
{
return aboutDialog;
}


public void initAboutDialog()
{
aboutDialog.setTitle("About");

Container con =aboutDialog.getContentPane();

Icon icon = new ImageIcon("smile.gif");
JLabel aboutLabel = new JLabel("<html><b><font size=5>"+
"<center>Jay"+"<br>Test Version",icon,JLabel.CENTER);

con.add(aboutLabel,BorderLayout.CENTER);

aboutDialog.setSize(450,225);
aboutDialog.setLocation(300,300);
aboutDialog.addWindowListener(new WindowAdapter()
{
public void WindowClosing(WindowEvent e)
{
dispose();
}
});
}
}

class CenterPanel extends JPanel
{
public CenterPanel()
{
JScrollPane jScrollPane1 = new JScrollPane();
JScrollPane jScrollPane2 = new JScrollPane();

JTextPane jTextPaneA = new JTextPane();
JTextPane jTextPaneB = new JTextPane();
UIManager.getInstance().setJTextPaneA(jTextPaneA);
UIManager.getInstance().setJTextPaneB(jTextPaneB);


jTextPaneA.setDocument(new DefaultStyledDocument());
jTextPaneB.setDocument(new DefaultStyledDocument());

jScrollPane1.setViewportView(jTextPaneA);
jScrollPane2.setViewportView(jTextPaneB);



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

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

public void actionPerformed(ActionEvent e) {
System.out.println("Press the button!!");
JTextPane jTextPaneA = UIManager.getInstance().getJTextPaneA();
JTextPane jTextPaneB = UIManager.getInstance().getJTextPaneB();

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

try {
String str1 = docA.getText(0, docA.getLength());
String str2 = docB.getText(0, docB.getLength());

DiffProcessor processor = ProcessorManager.getInstance().getDiffProcessor();
processor.reSetString(str1, str2);

int[][] result = processor.process();
// for (int i=0; i<result.length; i++){
// for (int j=0; j<result[i].length; j++){
// System.out.print(result[i][j]);
// }
// System.out.println();
// }

MutableAttributeSet diffAttr = UIManager.getInstance().getDiffAttr();
MutableAttributeSet defaultAttr = UIManager.getInstance().getDefaultAttr();

// set jTextPaneA
for (int i = 0; i<result[Const.STR_ARRAY_A].length; i++){
if (result[Const.STR_ARRAY_A][i] == 1){
docA.setCharacterAttributes(i, 1, diffAttr, true);
} else {
docA.setCharacterAttributes(i, 1, defaultAttr, true);
}
}

// set jTextPaneB
for (int i=0; i<result[Const.STR_ARRAY_B].length ; i++){
if (result[Const.STR_ARRAY_B][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 ViewerFrame();
ProcessorManager.getInstance().setDiffProcessor(new DiffProcessor());
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值