alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 * 
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 * 
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun
 * Microsystems, Inc. All Rights Reserved.
 */

package org.netbeans.modules.diff.builtin;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.io.Serializable;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.HashMap;
import java.util.Map;

import org.openide.NotifyDescriptor;
import org.openide.util.NbBundle;
import org.openide.util.Lookup;
import org.openide.windows.*;

import org.netbeans.api.diff.Diff;
//import org.netbeans.api.diff.DiffWrapperPanel;
import org.netbeans.api.diff.Difference;
import org.netbeans.spi.diff.*;
import org.openide.DialogDisplayer;
import org.openide.windows.WindowManager;

/**
 *
 * @author  Martin Entlicher
 */
public class DefaultDiff extends Diff implements Serializable {
    
    private boolean showDiffSelector = true;
    
    /** Creates a new instance of DefaultDiff */
    public DefaultDiff() {
    }
    
    /**
     * Get the display name of this diff provider.
     */
    public String getDisplayName() {
        return NbBundle.getMessage(DefaultDiff.class, "DefaultDiff.displayName");
    }
    
    /**
     * Show the visual representation of the diff between two sources.
     * @param name1 the name of the first source
     * @param title1 the title of the first source
     * @param r1 the first source
     * @param name2 the name of the second source
     * @param title2 the title of the second source
     * @param r2 the second resource compared with the first one.
     * @param MIMEType the mime type of these sources
     * @return The Component representing the diff visual representation
     *        or null, when the representation is outside the IDE.
     * @throws IOException when the reading from input streams fails.
     */
    public Component createDiff(String name1, String title1, Reader r1,
                                String name2, String title2, Reader r2,
                                String MIMEType) throws IOException {
                                    /*
        this.name1 = name1;
        this.name2 = name2;
        this.title1 = title1;
        this.title2 = title2;
        this.MIMEType = MIMEType;
        StringWriter out1 = new StringWriter();
        StringWriter out2 = new StringWriter();
        cpStream(r1, out1);
        cpStream(r2, out2);
        this.buffer1 = out1.toString();
        this.buffer2 = out2.toString();
                                     */
        //diffPanel = new DiffWrapperPanel(showDiffSelector, showDiffSelector);
        DiffInfo diffInfo = new DiffInfo(name1, name2, title1, title2,
            MIMEType, showDiffSelector, showDiffSelector, r1, r2);
        // I need to know the initial differences to know whether the files actually
        // differ or not.
        DiffProvider provider = (DiffProvider) Lookup.getDefault().lookup(DiffProvider.class);
        try {
            Difference[] diffs = provider.computeDiff(diffInfo.createFirstReader(), diffInfo.createSecondReader());
            if (diffs.length == 0) {
                DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(NbBundle.getMessage(DefaultDiff.class, "MSG_NoDifference", name1, name2)));
                return null;
            }
            diffInfo.setInitialDiffs(diffs);
        } catch (IOException ioex) {}
        DiffPresenter diffPanel = new DiffPresenter(diffInfo);
        TopComponent tp = new DiffTopComponent(diffPanel);
        diffInfo.setPresentingComponent(tp);
        diffPanel.setProvider(provider);
        diffPanel.setVisualizer((DiffVisualizer) Lookup.getDefault().lookup(DiffVisualizer.class));
        return tp;
        //if (!initPanel()) return null;
        //return tp;
    }
    
    /** Getter for property showDiffSelector.
     * @return Value of property showDiffSelector.
     */
    public boolean isShowDiffSelector() {
        return showDiffSelector;
    }
    
    /** Setter for property showDiffSelector.
     * @param showDiffSelector New value of property showDiffSelector.
     */
    public void setShowDiffSelector(boolean showDiffSelector) {
        this.showDiffSelector = showDiffSelector;
    }
    
    /*
    private boolean initPanel() throws IOException {
        Lookup.Result providersResult = Lookup.getDefault().lookup(new Lookup.Template(DiffProvider.class));
        Lookup.Item[] providers = new Lookup.Item[providersResult.allItems().size()];
        int i = 0;
        for (Iterator it = providersResult.allItems().iterator(); it.hasNext(); i++) {
            providers[i] = (Lookup.Item) it.next();
        }
        Lookup.Result visualizersResult = Lookup.getDefault().lookup(new Lookup.Template(DiffVisualizer.class));
        Lookup.Item[] visualizers = new Lookup.Item[visualizersResult.allInstances().size()];
        i = 0;
        for (Iterator it = visualizersResult.allItems().iterator(); it.hasNext(); i++) {
            visualizers[i] = (Lookup.Item) it.next();
        }
        if (providers.length == 0 || visualizers.length == 0) {
            if (providers.length == 0) {
                TopManager.getDefault().notify(new NotifyDescriptor.Message(
                    NbBundle.getMessage(DefaultDiff.class, "MSG_ProvidersMissing")));
            } else if (visualizers.length == 0) {
                TopManager.getDefault().notify(new NotifyDescriptor.Message(
                    NbBundle.getMessage(DefaultDiff.class, "MSG_VisualizersMissing")));
            }
            return false;
        }
        providersMap = new HashMap();
        visualizersMap = new HashMap();
        String[] providersDisplayNames = new String[providers.length];
        for (i = 0; i < providers.length; i++) {
            providersDisplayNames[i] = providers[i].getDisplayName();
            providersMap.put(providersDisplayNames[i], providers[i]);
        }
        String[] visualizersDisplayNames = new String[visualizers.length];
        for (i = 0; i < visualizers.length; i++) {
            visualizersDisplayNames[i] = visualizers[i].getDisplayName();
            visualizersMap.put(visualizersDisplayNames[i], visualizers[i]);
        }
        defaultProviderName = providersDisplayNames[0];
        defaultVisualizerName = visualizersDisplayNames[0];
        diffPanel.showProvidersChooser(true);
        diffPanel.showVisualizerChooser(true);
        diffPanel.setProviders(providersDisplayNames);
        diffPanel.setVisualizers(visualizersDisplayNames);
        diffPanel.setVisualizer((DiffVisualizer) visualizers[0].getInstance());
        diffPanel.addProvidersChangeListener(new ProvidersChangeListener());
        diffPanel.addVisualizersChangeListener(new VisualizerChangeListener());
        showDiff();
        return true;
    }
     */
    
    /*
    private boolean initPanel() throws IOException {
        DiffProvider provider = (DiffProvider) Lookup.getDefault().lookup(DiffProvider.class);
        DiffVisualizer visualizer = (DiffVisualizer) Lookup.getDefault().lookup(DiffVisualizer.class);
        diffPanel.setProvider(provider);
        diffPanel.setVisualizer(visualizer);
        ServicesChangeListener l = new ServicesChangeListener();
        diffPanel.addProvidersChangeListener(l);
        diffPanel.addVisualizersChangeListener(l);
        showDiff(provider, visualizer);
        return true;
    }
    
    private synchronized void showDiff(DiffProvider p, DiffVisualizer v) throws IOException {
        Difference[] diffs = p.computeDiff(new StringReader(buffer1),
                                           new StringReader(buffer2));
        Component c = v.createView(diffs, name1, title1, new StringReader(buffer1),
                                   name2, title2, new StringReader(buffer2), MIMEType);
        diffPanel.setVisualizer(c);
        tp.setName(c.getName());
        if (c instanceof TopComponent) {
            TopComponent vtp = (TopComponent) c;
            tp.setToolTipText(vtp.getToolTipText());
            tp.setIcon(vtp.getIcon());
        }
        c.requestFocus();
    }
     */
    
    /*
    private synchronized void showDiff() throws IOException {
        //System.out.println("showDiff("+defaultProviderName+", "+defaultVisualizerName+")");
        Lookup.Item pItem = (Lookup.Item) providersMap.get(defaultProviderName);
        Lookup.Item vItem = (Lookup.Item) visualizersMap.get(defaultVisualizerName);
        DiffProvider p = (DiffProvider) pItem.getInstance();
        DiffVisualizer v = (DiffVisualizer) vItem.getInstance();
        Difference[] diffs = p.computeDiff(new StringReader(buffer1),
                                           new StringReader(buffer2));
        Component c = v.createView(diffs, name1, title1, new StringReader(buffer1),
                                   name2, title2, new StringReader(buffer2), MIMEType);
        diffPanel.setVisualizer(c);
        diffPanel.setDefaultProvider(defaultProviderName);
        diffPanel.setDefaultVisualizer(defaultVisualizerName);
        tp.setName(c.getName());
        if (c instanceof TopComponent) {
            TopComponent vtp = (TopComponent) c;
            tp.setToolTipText(vtp.getToolTipText());
            tp.setIcon(vtp.getIcon());
        }
        c.requestFocus();
    }
     */
    
    private static void cpStream(Reader in, Writer out) throws IOException {
        char[] buff = new char[1024];
        int n;
        while ((n = in.read(buff)) > 0) {
            out.write(buff, 0, n);
        }
        in.close();
        out.close();
    }
    
    /*
    private class ServicesChangeListener implements java.beans.PropertyChangeListener {
        
        /**
         * This method gets called when a bound property is changed.
         * @param evt A PropertyChangeEvent object describing the event source
         *  	and the property that has changed.
         *
        public void propertyChange(java.beans.PropertyChangeEvent evt) {
            try {
                showDiff(diffPanel.getProvider(), diffPanel.getVisualizer());
            } catch (IOException ioex) {
                TopManager.getDefault().notifyException(ioex);
            }
        }
        
    }
     */
    
    /*
    private class ProvidersChangeListener implements ItemListener {
        
        /**
         * Invoked when an item has been selected or deselected.
         * The code written for this method performs the operations
         * that need to occur when an item is selected (or deselected).
         *
        public void itemStateChanged(ItemEvent e) {
            if (e.SELECTED == e.getStateChange()) {
                defaultProviderName = (String) e.getItem();
                try {
                    showDiff();
                } catch (IOException ioex) {
                    TopManager.getDefault().notifyException(ioex);
                }
            }
        }
        
    }
    
    private class VisualizerChangeListener implements ItemListener {
        
        /**
         * Invoked when an item has been selected or deselected.
         * The code written for this method performs the operations
         * that need to occur when an item is selected (or deselected).
         *
        public void itemStateChanged(ItemEvent e) {
            if (e.SELECTED == e.getStateChange()) {
                //defaultVisualizerName = (String) e.getItem();
                System.out.println("visualizer = "+e.getItem());
                try {
                    showDiff();
                } catch (IOException ioex) {
                    TopManager.getDefault().notifyException(ioex);
                }
            }
        }
        
    }
     */
    
    private static class DiffInfo extends DiffPresenter.Info {
        
        private String buffer1, buffer2;
        private Difference[] diffs;
        
        public DiffInfo(String name1, String name2, String title1, String title2,
                        String mimeType, boolean chooseProviders, boolean chooseVisualizers,
                        Reader r1, Reader r2) throws IOException {
            super(name1, name2, title1, title2, mimeType, chooseProviders, chooseVisualizers);
            StringWriter out1 = new StringWriter();
            StringWriter out2 = new StringWriter();
            cpStream(r1, out1);
            cpStream(r2, out2);
            this.buffer1 = out1.toString();
            this.buffer2 = out2.toString();
        }
        
        public Reader createFirstReader() {
            return new StringReader(buffer1);
        }
        
        public Reader createSecondReader() {
            return new StringReader(buffer2);
        }
        
        void setInitialDiffs(Difference[] diffs) {
            this.diffs = diffs;
        }
        
        public Difference[] getInitialDifferences() {
            Difference[] diffs = this.diffs;
            this.diffs = null;
            return diffs;
        }
        
    }
    
    public static class DiffTopComponent extends TopComponent {
        
        public DiffTopComponent(Component c) {
            setLayout(new BorderLayout());
            add(c, BorderLayout.CENTER);            
            getAccessibleContext().setAccessibleName(NbBundle.getMessage(DiffTopComponent.class, "ACSN_Diff_Top_Component")); // NOI18N
            getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(DiffTopComponent.class, "ACSD_Diff_Top_Component")); // NOI18N
        }
        
        public int getPersistenceType(){
            return TopComponent.PERSISTENCE_NEVER;
        }
        
        protected String preferredID(){
            return "DiffTopComponent";    //NOI18N       
        }
        
        public void open(Workspace workspace) {
            super.open(workspace);
            //diffPanel.open();
            requestActive();
        }
        
    }
    
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.