diff options
Diffstat (limited to 'bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchFileTypedElement.java')
-rw-r--r-- | bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchFileTypedElement.java | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchFileTypedElement.java b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchFileTypedElement.java new file mode 100644 index 000000000..86c5fff2d --- /dev/null +++ b/bundles/org.eclipse.compare/compare/org/eclipse/compare/internal/patch/PatchFileTypedElement.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * Copyright (c) 2006, 2010 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.patch; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.List; + +import org.eclipse.compare.CompareUI; +import org.eclipse.compare.IEncodedStreamContentAccessor; +import org.eclipse.compare.ITypedElement; +import org.eclipse.compare.internal.CompareUIPlugin; +import org.eclipse.compare.internal.core.patch.DiffProject; +import org.eclipse.compare.internal.core.patch.FileDiffResult; +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.jface.resource.LocalResourceManager; +import org.eclipse.swt.graphics.Image; + +public class PatchFileTypedElement implements ITypedElement, + IEncodedStreamContentAccessor { + + private final FileDiffResult result; + private final boolean isAfterState; + + public PatchFileTypedElement(FileDiffResult result, boolean isAfterState) { + this.result = result; + this.isAfterState = isAfterState; + } + + public Image getImage() { + IFile file = getPatcher().getTargetFile(result.getDiff()); + if (file == null) { + // We don't get a target file if the file doesn't exist + DiffProject project = result.getDiff().getProject(); + if (project != null) { + file = Utilities.getProject(project).getFile( + result.getDiff().getPath( + result.getConfiguration().isReversed())); + } else { + IResource target = getPatcher().getTarget(); + if (target instanceof IFile) { + file = (IFile) target; + } else if (target instanceof IContainer) { + IContainer container = (IContainer) target; + file = container.getFile(result.getTargetPath()); + } + } + } + Image image = null; + if (file != null) { + image = CompareUI.getImage(file); + } + if (result.containsProblems()) { + LocalResourceManager imageCache = PatchCompareEditorInput + .getImageCache(result.getConfiguration()); + image = HunkTypedElement.getHunkErrorImage(image, imageCache, true); + } + return image; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.compare.ITypedElement#getName() + */ + public String getName() { + return result.getTargetPath().toString(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.compare.ITypedElement#getType() + */ + public String getType() { + return result.getTargetPath().getFileExtension(); + } + + public String getCharset() throws CoreException { + return result.getCharset(); + } + + public InputStream getContents() throws CoreException { + // If there are cached contents, use them + if (isAfterState && getPatcher().hasCachedContents(result.getDiff())) + return new ByteArrayInputStream(getPatcher().getCachedContents( + result.getDiff())); + // Otherwise, get the lines from the diff result + List lines; + if (isAfterState) { + lines = result.getAfterLines(); + } else { + lines = result.getBeforeLines(); + } + String contents = LineReader.createString(getPatcher() + .isPreserveLineDelimeters(), lines); + String charSet = getCharset(); + byte[] bytes = null; + if (charSet != null) { + try { + bytes = contents.getBytes(charSet); + } catch (UnsupportedEncodingException e) { + CompareUIPlugin.log(e); + } + } + if (bytes == null) { + bytes = contents.getBytes(); + } + return new ByteArrayInputStream(bytes); + } + + private Patcher getPatcher() { + return Patcher.getPatcher(result.getConfiguration()); + } + +} |