blob: b7482e6a95b4d3d971fe8a593c785cc9f5e22f70 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 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.ltk.internal.ui.refactoring;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.resources.IResource;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.GroupCategory;
import org.eclipse.ltk.core.refactoring.TextEditBasedChange;
import org.eclipse.ltk.core.refactoring.TextEditBasedChangeGroup;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.compare.CompareConfiguration;
import org.eclipse.compare.CompareUI;
import org.eclipse.compare.CompareViewerSwitchingPane;
import org.eclipse.compare.IEncodedStreamContentAccessor;
import org.eclipse.compare.IResourceProvider;
import org.eclipse.compare.ITypedElement;
import org.eclipse.compare.structuremergeviewer.DiffNode;
import org.eclipse.compare.structuremergeviewer.ICompareInput;
import org.eclipse.ltk.ui.refactoring.ChangePreviewViewerInput;
import org.eclipse.ltk.ui.refactoring.IChangePreviewViewer;
public class TextEditChangePreviewViewer implements IChangePreviewViewer {
private ComparePreviewer fViewer;
private static class TextEditBasedChangeInput extends ChangePreviewViewerInput {
TextEditBasedChangeGroup group;
int surroundingLines;
TextEditBasedChangeGroup[] groups;
IRegion range;
GroupCategory groupCategory;
public TextEditBasedChangeInput(Change change) {
super(change);
}
}
private static class ComparePreviewer extends CompareViewerSwitchingPane {
private CompareConfiguration fCompareConfiguration;
private String fLabel;
private ImageDescriptor fDescriptor;
private Image fImage;
public ComparePreviewer(Composite parent) {
super(parent, SWT.BORDER | SWT.FLAT, true);
fCompareConfiguration= new CompareConfiguration();
fCompareConfiguration.setLeftEditable(false);
fCompareConfiguration.setLeftLabel(RefactoringUIMessages.ComparePreviewer_original_source);
fCompareConfiguration.setRightEditable(false);
fCompareConfiguration.setRightLabel(RefactoringUIMessages.ComparePreviewer_refactored_source);
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (fImage != null && !fImage.isDisposed())
fImage.dispose();
}
});
}
public void setLabel(String label) {
fLabel= label;
}
public void setImageDescriptor(ImageDescriptor imageDescriptor) {
fDescriptor= imageDescriptor;
}
protected Viewer getViewer(Viewer oldViewer, Object input) {
return CompareUI.findContentViewer(oldViewer, (ICompareInput)input, this, fCompareConfiguration);
}
public void setText(String text) {
if (fLabel != null) {
super.setText(fLabel);
} else {
super.setText(text);
}
Image current= null;
if (fDescriptor != null) {
current= fImage;
fImage= fDescriptor.createImage();
} else {
current= fImage;
fImage= null;
}
setImage(fImage);
if (current != null) {
current.dispose();
}
}
}
private static class CompareElement implements ITypedElement, IEncodedStreamContentAccessor, IResourceProvider {
// we use an encoding that preserves Unicode across the stream
private static final String ENCODING= "UTF-8"; //$NON-NLS-1$
private String fContent;
private String fType;
private IResource fResource;
public CompareElement(String content, String type, IResource resource) {
fContent= content;
fType= type;
fResource= resource;
}
public String getName() {
return RefactoringUIMessages.ComparePreviewer_element_name;
}
public Image getImage() {
return null;
}
public String getType() {
return fType;
}
public InputStream getContents() throws CoreException {
try {
return new ByteArrayInputStream(fContent.getBytes(ENCODING));
} catch (UnsupportedEncodingException e) {
return new ByteArrayInputStream(fContent.getBytes());
}
}
public String getCharset() {
return ENCODING;
}
public IResource getResource() {
return fResource;
}
}
public static ChangePreviewViewerInput createInput(TextEditBasedChange change) {
return new ChangePreviewViewerInput(change);
}
public static ChangePreviewViewerInput createInput(Change change, TextEditBasedChangeGroup group, int surroundingLines) {
TextEditBasedChangeInput input= new TextEditBasedChangeInput(change);
input.group= group;
input.surroundingLines= surroundingLines;
return input;
}
public static ChangePreviewViewerInput createInput(Change change, TextEditBasedChangeGroup[] groups, IRegion range) {
TextEditBasedChangeInput input= new TextEditBasedChangeInput(change);
input.groups= groups;
input.range= range;
return input;
}
public void createControl(Composite parent) {
fViewer= new ComparePreviewer(parent);
}
public Control getControl() {
return fViewer;
}
public void setInput(ChangePreviewViewerInput input) {
try {
Change change= input.getChange();
if (input instanceof TextEditBasedChangeInput) {
TextEditBasedChangeInput extended= (TextEditBasedChangeInput)input;
if (extended.group != null && extended.surroundingLines >= 0) {
TextEditBasedChangeGroup group= extended.group;
TextEditBasedChange editChange= group.getTextEditChange();
setInput(editChange, editChange.getCurrentContent(group.getRegion(), true, 2, new NullProgressMonitor()),
editChange.getPreviewContent(new TextEditBasedChangeGroup[] { group }, group.getRegion(), true, 2, new NullProgressMonitor()),
editChange.getTextType());
return;
} else if (extended.groups != null && extended.groups.length > 0 && extended.range != null) {
TextEditBasedChange editChange= extended.groups[0].getTextEditChange();
TextEditBasedChangeGroup[] groups= extended.groups;
if (extended.groupCategory != null) {
}
setInput(editChange, editChange.getCurrentContent(extended.range, true, 0, new NullProgressMonitor()),
editChange.getPreviewContent(groups, extended.range, true, 0, new NullProgressMonitor()),
editChange.getTextType());
return;
}
} else if (change instanceof TextEditBasedChange) {
TextEditBasedChange editChange= (TextEditBasedChange)change;
setInput(editChange, editChange.getCurrentContent(new NullProgressMonitor()), editChange.getPreviewContent(new NullProgressMonitor()), editChange.getTextType());
return;
} else {
fViewer.setInput(null);
}
} catch (CoreException e) {
RefactoringUIPlugin.log(e);
fViewer.setInput(null);
}
}
public void refresh() {
fViewer.getViewer().refresh();
}
private void setInput(TextEditBasedChange change, String left, String right, String type) {
Object element= change.getModifiedElement();
IResource resource= null;
if (element instanceof IAdaptable) {
IAdaptable adaptable= (IAdaptable)element;
IWorkbenchAdapter workbenchAdapter= (IWorkbenchAdapter)adaptable.getAdapter(IWorkbenchAdapter.class);
if (workbenchAdapter != null) {
fViewer.setLabel(workbenchAdapter.getLabel(element));
fViewer.setImageDescriptor(workbenchAdapter.getImageDescriptor(element));
} else {
fViewer.setLabel(null);
fViewer.setImageDescriptor(null);
}
resource= (IResource)adaptable.getAdapter(IResource.class);
} else {
fViewer.setLabel(null);
fViewer.setImageDescriptor(null);
}
fViewer.setInput(new DiffNode(
new CompareElement(left, type, resource),
new CompareElement(right, type, resource)));
}
}