org.eclipse.compare.internal.EditionAction.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.compare.internal.EditionAction.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.compare.internal;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ResourceBundle;
import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;

import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.graphics.Image;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.BadLocationException;

import org.eclipse.ui.*;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.actions.WorkspaceModifyOperation;

import org.eclipse.compare.*;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.IStreamContentAccessor;

public class EditionAction extends BaseCompareAction {

    /**
     * Implements the IStreamContentAccessor and ITypedElement protocols
     * for a Document.
     */
    class DocumentBufferNode implements ITypedElement, IEncodedStreamContentAccessor {
        private static final String UTF_16 = "UTF-16"; //$NON-NLS-1$
        private IDocument fDocument;
        private IFile fFile;

        DocumentBufferNode(IDocument document, IFile file) {
            fDocument = document;
            fFile = file;
        }

        public String getName() {
            return fFile.getName();
        }

        public String getType() {
            return fFile.getFileExtension();
        }

        public Image getImage() {
            return null;
        }

        public InputStream getContents() {
            return new ByteArrayInputStream(Utilities.getBytes(fDocument.get(), UTF_16));
        }

        public String getCharset() {
            return UTF_16;
        }
    }

    private String fBundleName;
    private boolean fReplaceMode;
    protected boolean fPrevious = false;
    protected String fHelpContextId;

    EditionAction(boolean replaceMode, String bundleName) {
        fReplaceMode = replaceMode;
        fBundleName = bundleName;
    }

    protected boolean isEnabled(ISelection selection) {
        return Utilities.getFiles(selection).length == 1; // we don't support multiple selection for now
    }

    protected void run(ISelection selection) {
        IFile[] files = Utilities.getFiles(selection);
        for (int i = 0; i < files.length; i++)
            doFromHistory(files[i]);
    }

    private void doFromHistory(final IFile file) {

        ResourceBundle bundle = ResourceBundle.getBundle(fBundleName);
        String title = Utilities.getString(bundle, "title"); //$NON-NLS-1$

        Shell parentShell = CompareUIPlugin.getShell();

        IFileState states[] = null;
        try {
            states = file.getHistory(null);
        } catch (CoreException ex) {
            MessageDialog.openError(parentShell, title, ex.getMessage());
            return;
        }

        if (states == null || states.length <= 0) {
            String msg = Utilities.getString(bundle, "noLocalHistoryError"); //$NON-NLS-1$
            MessageDialog.openInformation(parentShell, title, msg);
            return;
        }

        ITypedElement base = new ResourceNode(file);

        IDocument document = getDocument(file);
        ITypedElement target = base;
        if (document != null)
            target = new DocumentBufferNode(document, file);

        ITypedElement[] editions = new ITypedElement[states.length + 1];
        editions[0] = base;
        for (int i = 0; i < states.length; i++)
            editions[i + 1] = new HistoryItem(base, states[i]);

        EditionSelectionDialog d = new EditionSelectionDialog(parentShell, bundle);
        d.setEditionTitleArgument(file.getName());
        d.setEditionTitleImage(CompareUIPlugin.getImage(file));
        //d.setHideIdenticalEntries(false);
        if (fHelpContextId != null)
            d.setHelpContextId(fHelpContextId);

        if (fReplaceMode) {

            ITypedElement ti = null;
            if (fPrevious)
                ti = d.selectPreviousEdition(target, editions, null);
            else
                ti = d.selectEdition(target, editions, null);

            if (ti instanceof IStreamContentAccessor) {
                IStreamContentAccessor sa = (IStreamContentAccessor) ti;

                if (Utilities.validateResource(file, parentShell, title)) {
                    try {

                        if (document != null)
                            updateDocument(document, sa);
                        else
                            updateWorkspace(bundle, parentShell, sa, file);

                    } catch (InterruptedException x) {
                        // Do nothing. Operation has been canceled by user.

                    } catch (InvocationTargetException x) {
                        String reason = x.getTargetException().getMessage();
                        MessageDialog.openError(parentShell, title,
                                Utilities.getFormattedString(bundle, "replaceError", reason)); //$NON-NLS-1$
                    }
                }
            }
        } else {
            d.setCompareMode(true);

            d.selectEdition(target, editions, null);
        }
    }

    private void updateWorkspace(final ResourceBundle bundle, Shell shell, final IStreamContentAccessor sa,
            final IFile file) throws InvocationTargetException, InterruptedException {
        WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
            public void execute(IProgressMonitor pm) throws InvocationTargetException {
                try {
                    String taskName = Utilities.getString(bundle, "taskName"); //$NON-NLS-1$
                    pm.beginTask(taskName, IProgressMonitor.UNKNOWN);
                    file.setContents(sa.getContents(), false, true, pm);
                } catch (CoreException e) {
                    throw new InvocationTargetException(e);
                } finally {
                    pm.done();
                }
            }
        };

        ProgressMonitorDialog pmdialog = new ProgressMonitorDialog(shell);
        pmdialog.run(false, true, operation);
    }

    private void updateDocument(IDocument document, IStreamContentAccessor sa) throws InvocationTargetException {
        try {
            String text = Utilities.readString(sa);
            document.replace(0, document.getLength(), text);
        } catch (CoreException e) {
            throw new InvocationTargetException(e);
        } catch (BadLocationException e) {
            throw new InvocationTargetException(e);
        }
    }

    private IDocument getDocument(IFile file) {
        IWorkbench wb = PlatformUI.getWorkbench();
        if (wb == null)
            return null;
        IWorkbenchWindow[] ws = wb.getWorkbenchWindows();
        if (ws == null)
            return null;

        FileEditorInput test = new FileEditorInput(file);

        for (int i = 0; i < ws.length; i++) {
            IWorkbenchWindow w = ws[i];
            IWorkbenchPage[] wps = w.getPages();
            if (wps != null) {
                for (int j = 0; j < wps.length; j++) {
                    IWorkbenchPage wp = wps[j];
                    IEditorPart ep = wp.findEditor(test);
                    if (ep instanceof ITextEditor) {
                        ITextEditor te = (ITextEditor) ep;
                        IDocumentProvider dp = te.getDocumentProvider();
                        if (dp != null) {
                            IDocument doc = dp.getDocument(ep);
                            if (doc != null)
                                return doc;
                        }
                    }
                }
            }
        }
        return null;
    }
}