com.aptana.ui.io.compare.FileStoreCompareEditorInput.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ui.io.compare.FileStoreCompareEditorInput.java

Source

/**
 * Aptana Studio
 * Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved.
 * Licensed under the terms of the Eclipse Public License (EPL).
 * Please see the license-epl.html included with this distribution for details.
 * Any modifications to this file must keep this entire header intact.
 */
// $codepro.audit.disable unnecessaryExceptions
package com.aptana.ui.io.compare;

import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;

import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareEditorInput;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.internal.BufferedResourceNode;
import org.eclipse.compare.internal.Utilities;
import org.eclipse.compare.structuremergeviewer.DiffNode;
import org.eclipse.compare.structuremergeviewer.DiffTreeViewer;
import org.eclipse.compare.structuremergeviewer.Differencer;
import org.eclipse.compare.structuremergeviewer.IDiffContainer;
import org.eclipse.compare.structuremergeviewer.IDiffElement;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.widgets.Composite;

/**
 * @author Michael Xia (mxia@appcelerator.com)
 */
@SuppressWarnings("restriction")
public class FileStoreCompareEditorInput extends CompareEditorInput {

    private Object fRoot;
    private FileStoreNode fLeft;
    private FileStoreNode fRight;
    private IFileStore fLeftFileStore;
    private IFileStore fRightFileStore;
    private DiffTreeViewer fDiffViewer;
    private IAction fOpenAction;

    class MyDiffNode extends DiffNode {
        private boolean fDirty = false;
        private ITypedElement fLastId;
        private String fLastName;

        protected MyDiffNode(IDiffContainer parent, int description, ITypedElement ancestor, ITypedElement left,
                ITypedElement right) {
            super(parent, description, ancestor, left, right);
        }

        @Override
        public void fireChange() {
            super.fireChange();
            setDirty(true);
            fDirty = true;
            if (fDiffViewer != null) {
                fDiffViewer.refresh(this);
            }
        }

        void clearDirty() {
            fDirty = false;
        }

        @Override
        public String getName() {
            if (fLastName == null) {
                fLastName = super.getName();
            }
            if (fDirty) {
                return MessageFormat.format("<{0}>", fLastName); //$NON-NLS-1$
            }
            return fLastName;
        }

        @Override
        public ITypedElement getId() {
            ITypedElement id = super.getId();
            if (id == null) {
                return fLastId;
            }
            fLastId = id;
            return id;
        }
    }

    /**
     * Creates an compare editor input for the given file store selection.
     * 
     * @param config
     */
    public FileStoreCompareEditorInput(CompareConfiguration config) {
        super(config);
    }

    @Override
    public Viewer createDiffViewer(Composite parent) {
        fDiffViewer = new DiffTreeViewer(parent, getCompareConfiguration()) {

            @Override
            protected void fillContextMenu(IMenuManager manager) {
                if (fOpenAction == null) {
                    fOpenAction = new Action() {
                        public void run() {
                            handleOpen(null);
                        }
                    };
                    Utilities.initAction(fOpenAction, getBundle(), "action.CompareContents."); //$NON-NLS-1$
                }

                boolean enable = false;
                ISelection selection = getSelection();
                if (selection instanceof IStructuredSelection) {
                    IStructuredSelection ss = (IStructuredSelection) selection;
                    if (ss.size() == 1) {
                        Object element = ss.getFirstElement();
                        if (element instanceof MyDiffNode) {
                            ITypedElement typedElement = ((MyDiffNode) element).getId();
                            if (typedElement != null) {
                                enable = !ITypedElement.FOLDER_TYPE.equals(typedElement.getType());
                            }
                        } else {
                            enable = true;
                        }
                    }
                }
                fOpenAction.setEnabled(enable);
                manager.add(fOpenAction);

                super.fillContextMenu(manager);
            }
        };
        return fDiffViewer;
    }

    /**
     * Sets the left file store.
     * 
     * @param fileStore
     */
    public void setLeftFileStore(IFileStore fileStore) {
        setLeftFileStore(fileStore, null);
    }

    /**
     * Sets the left file store with a specific name.
     * 
     * @param fileStore
     */
    public void setLeftFileStore(IFileStore fileStore, String name) {
        fLeftFileStore = fileStore;
        fLeft = new FileStoreNode(fLeftFileStore, name);
    }

    /**
     * Sets the right file store.
     * 
     * @param resource
     */
    public void setRightFileStore(IFileStore fileStore) {
        setRightFileStore(fileStore, null);
    }

    /**
     * Sets the right file store with a specific name.
     * 
     * @param resource
     */
    public void setRightFileStore(IFileStore fileStore, String name) {
        fRightFileStore = fileStore;
        fRight = new FileStoreNode(fRightFileStore, name);
    }

    /**
     * Initializes the images in the compare configuration.
     */
    public void initializeCompareConfiguration() {
        CompareConfiguration cc = getCompareConfiguration();
        if (fLeft != null) {
            cc.setLeftLabel(fLeft.getName());
            cc.setLeftImage(fLeft.getImage());
        }
        if (fRight != null) {
            cc.setRightLabel(fRight.getName());
            cc.setRightImage(fRight.getImage());
        }
    }

    /**
     * Method for any file prep-work before running the differecer. Does nothing by default; subclasses should override
     */
    protected void prepareFiles() {
    }

    @Override
    public Object prepareInput(IProgressMonitor pm) throws InvocationTargetException {
        try {
            pm.beginTask(Utilities.getString("ResourceCompare.taskName"), IProgressMonitor.UNKNOWN); //$NON-NLS-1$

            prepareFiles();

            String leftLabel = fLeft.getName();
            String rightLabel = fRight.getName();

            String format = Utilities.getString("ResourceCompare.twoWay.title"); //$NON-NLS-1$
            String title = MessageFormat.format(format, new Object[] { leftLabel, rightLabel });
            setTitle(title);

            Differencer d = new Differencer() {

                @Override
                protected Object visit(Object parent, int description, Object ancestor, Object left, Object right) {
                    return new MyDiffNode((IDiffContainer) parent, description, (ITypedElement) ancestor,
                            (ITypedElement) left, (ITypedElement) right);
                }
            };

            fRoot = d.findDifferences(false, pm, null, null, fLeft, fRight);
            return fRoot;

        } finally {
            pm.done();
        }
    }

    @Override
    public String getToolTipText() {
        if (fLeftFileStore != null && fRightFileStore != null) {
            String leftLabel = fLeftFileStore.toString();
            String rightLabel = fRightFileStore.toString();

            String format = Utilities.getString("ResourceCompare.twoWay.tooltip"); //$NON-NLS-1$
            return MessageFormat.format(format, new Object[] { leftLabel, rightLabel });
        }
        return super.getToolTipText();
    }

    @Override
    public void saveChanges(IProgressMonitor pm) throws CoreException {
        super.saveChanges(pm);
        if (fRoot instanceof DiffNode) {
            try {
                commit(pm, (DiffNode) fRoot);
            } finally {
                if (fDiffViewer != null) {
                    fDiffViewer.refresh();
                }
                setDirty(false);
            }
        }
    }

    /*
     * Recursively walks the diff tree and commits all changes.
     */
    private static void commit(IProgressMonitor pm, DiffNode node) throws CoreException {
        if (node instanceof MyDiffNode) {
            ((MyDiffNode) node).clearDirty();
        }

        ITypedElement left = node.getLeft();
        if (left instanceof BufferedResourceNode) {
            ((BufferedResourceNode) left).commit(pm);
        }

        ITypedElement right = node.getRight();
        if (right instanceof BufferedResourceNode) {
            ((BufferedResourceNode) right).commit(pm);
        }

        IDiffElement[] children = node.getChildren();
        if (children != null) {
            for (IDiffElement element : children) {
                if (element instanceof DiffNode) {
                    commit(pm, (DiffNode) element);
                }
            }
        }
    }
}