diff Viewer

18615 단어 J#
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());
    }
}

좋은 웹페이지 즐겨찾기