Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java')
-rw-r--r--bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java180
1 files changed, 180 insertions, 0 deletions
diff --git a/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java
new file mode 100644
index 000000000..1f26392b3
--- /dev/null
+++ b/bundles/org.eclipse.compare/plugins/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchCompareInput.java
@@ -0,0 +1,180 @@
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+package org.eclipse.compare.internal.patch;
+
+import java.io.*;
+import java.io.ByteArrayInputStream;
+import java.text.MessageFormat;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.core.resources.*;
+
+import org.eclipse.jface.viewers.*;
+
+import org.eclipse.compare.*;
+import org.eclipse.compare.structuremergeviewer.*;
+import org.eclipse.compare.internal.*;
+
+
+/**
+ * A PatchCompareInput uses a Patcher to
+ * patch selected workspace resources.
+ */
+/* package */ class PatchCompareInput extends CompareEditorInput {
+
+ static class Rejected extends DiffNode implements IStreamContentAccessor {
+ Diff fDiff;
+ String fName;
+ Rejected(IDiffContainer parent, String name, Diff diff) {
+ super(parent, Differencer.NO_CHANGE);
+ fName= name;
+ fDiff= diff;
+ }
+ public String getName() {
+ return fName + " *"; //$NON-NLS-1$
+ }
+ public String getType() {
+ return "txt"; //$NON-NLS-1$
+ }
+ public Image getImage() {
+ return CompareUI.getImage("file"); //$NON-NLS-1$
+ }
+ public InputStream getContents() {
+ return new ByteArrayInputStream(fDiff.fRejected.getBytes());
+ }
+ }
+
+ private DiffNode fRoot;
+ private IResource fTarget;
+ private Patcher fPatcher;
+
+ /**
+ * Creates an compare editor input for the given selection.
+ */
+ /* package */ PatchCompareInput(CompareConfiguration config, Patcher patcher, ISelection selection) {
+ super(config);
+ fPatcher= patcher;
+ IResource[] s= Utilities.getResources(selection);
+ if (s.length == 1)
+ fTarget= s[0];
+ }
+
+ /**
+ * Performs a two-way or three-way diff on the current selection.
+ */
+ public Object prepareInput(IProgressMonitor pm) throws InvocationTargetException {
+
+ CompareConfiguration cc= (CompareConfiguration) getCompareConfiguration();
+
+ try {
+ Diff[] diffs= fPatcher.getDiffs();
+
+ pm.beginTask(Utilities.getString("ResourceCompare.taskName"), diffs.length); //$NON-NLS-1$
+
+ fRoot= new DiffNode(0);
+ IContainer rootFolder= null;
+ if (fTarget instanceof IContainer)
+ rootFolder= (IContainer) fTarget;
+
+ for (int i= 0; i < diffs.length; i++) {
+ Diff diff= diffs[i];
+ if (diff.fIsEnabled) {
+ IPath path= fPatcher.getPath(diff);
+ createPath(fRoot, rootFolder, path, diff, false);
+
+ String rej= diff.fRejected;
+ if (rej != null) {
+ IPath pp= path.removeLastSegments(1);
+ pp= pp.append(path.lastSegment() + ".rej"); //$NON-NLS-1$
+ createPath(fRoot, rootFolder, pp, diff, true);
+ }
+ }
+ pm.worked(1);
+ }
+
+ fTarget.refreshLocal(IResource.DEPTH_INFINITE, pm);
+
+ String leftLabel= fTarget.getName();
+ cc.setLeftLabel(leftLabel);
+ cc.setLeftImage(CompareUIPlugin.getImage(fTarget));
+
+ String rformat= PatchMessages.getString("PatchCompareInput.RightTitle.format"); //$NON-NLS-1$
+ String rightLabel= MessageFormat.format(rformat, new String[] { fPatcher.getName() } );
+ cc.setRightLabel(rightLabel);
+ //cc.setRightImage(CompareUIPlugin.getImage(fRightResource));
+
+ String format= Utilities.getString("ResourceCompare.twoWay.title"); //$NON-NLS-1$
+ String title= MessageFormat.format(format, new String[] {leftLabel, rightLabel} );
+ setTitle(title);
+
+ return fRoot;
+
+ } catch (CoreException ex) {
+ throw new InvocationTargetException(ex);
+ } finally {
+ pm.done();
+ }
+ }
+
+ public void saveChanges(IProgressMonitor pm) throws CoreException {
+ if (fRoot instanceof DiffNode) {
+ try {
+ commit(pm, (DiffNode) fRoot);
+ } finally {
+ setDirty(false);
+ }
+ }
+ }
+
+ /*
+ * Recursively walks the diff tree and commits all changes.
+ */
+ private static void commit(IProgressMonitor pm, DiffNode node) throws CoreException {
+
+ 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 (int i= 0; i < children.length; i++) {
+ IDiffElement element= children[i];
+ if (element instanceof DiffNode)
+ commit(pm, (DiffNode) element);
+ }
+ }
+ }
+
+ private void createPath(DiffContainer root, IContainer folder, IPath path, Diff diff, boolean reject) {
+ if (path.segmentCount() > 1) {
+ IFolder f= folder.getFolder(path.uptoSegment(1));
+ IDiffElement child= root.findChild(path.segment(0));
+ if (child == null) {
+ ResourceNode rn= new ResourceNode(f);
+ child= new DiffNode(root, Differencer.CHANGE, null, rn, rn);
+ }
+ if (child instanceof DiffContainer)
+ createPath((DiffContainer)child, f, path.removeFirstSegments(1), diff, reject);
+ } else {
+ // a leaf
+ BufferedResourceNode rn= new BufferedResourceNode(folder.getFile(path));
+ if (reject) {
+ new Rejected(root, path.segment(0), diff);
+ } else {
+ new DiffNode(root, diff.getType(), null, rn, new PatchedResource(rn, diff, path, fPatcher));
+ }
+ }
+ }
+}
+
+

Back to the top