/******************************************************************************* * Copyright (c) 2008, 2009 Institute for Software, HSR Hochschule fuer Technik * Rapperswil, University of applied sciences 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: * Institute for Software - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.dialogs; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; import org.eclipse.compare.CompareConfiguration; import org.eclipse.compare.CompareViewerPane; import org.eclipse.compare.IEncodedStreamContentAccessor; import org.eclipse.compare.IResourceProvider; import org.eclipse.compare.ITypedElement; import org.eclipse.compare.contentmergeviewer.IMergeViewerContentProvider; import org.eclipse.compare.structuremergeviewer.DiffNode; import org.eclipse.compare.structuremergeviewer.ICompareInput; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.TextViewer; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.ui.refactoring.ChangePreviewViewerInput; import org.eclipse.ltk.ui.refactoring.IChangePreviewViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.cdt.ui.CElementLabelProvider; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.refactoring.CTextFileChange; import org.eclipse.cdt.ui.text.CSourceViewerConfiguration; import org.eclipse.cdt.internal.ui.compare.CMergeViewer; import org.eclipse.cdt.internal.ui.text.CTextTools; /** * @author Emanuel Graf * */ public class CTextEditChangePreviewViewer implements IChangePreviewViewer { private CPPMergeViewer viewer; private CTextEditChangePane viewerPane; private CTextEditChangePreviewViewerContentProvider textEditChangeContentProvider; private static class CTextEditChangePane extends CompareViewerPane{ /** * @param parent * @param style */ public CTextEditChangePane(Composite parent, int style) { super(parent, style); } } private class CPPMergeViewer extends CMergeViewer{ /** * @param parent * @param styles * @param mp */ public CPPMergeViewer(Composite parent, int styles, CompareConfiguration mp) { super(parent, styles, mp); } @Override protected CSourceViewerConfiguration getSourceViewerConfiguration() { CTextTools tools= CUIPlugin.getDefault().getTextTools(); IPreferenceStore store= CUIPlugin.getDefault().getCombinedPreferenceStore(); return new CSourceViewerConfiguration(tools.getColorManager(), store, null, tools.getDocumentPartitioning()); } @Override protected void configureTextViewer(TextViewer textViewer) { if (textViewer instanceof SourceViewer) { ((SourceViewer)textViewer).configure(getSourceViewerConfiguration()); } } } private class CTextEditChangePreviewViewerContentProvider implements IMergeViewerContentProvider{ public Object getAncestorContent(Object input) { if (input instanceof ICompareInput) return ((ICompareInput) input).getAncestor(); return null; } public Image getAncestorImage(Object input) { if (input instanceof ICompareInput) { ITypedElement ancestor = ((ICompareInput) input).getAncestor(); if(ancestor != null) { return ancestor.getImage(); } } return null; } public String getAncestorLabel(Object input) { if (input instanceof ICompareInput) { ITypedElement ancestor = ((ICompareInput) input).getAncestor(); if(ancestor != null) { return ancestor.getName(); } } return null; } public Object getLeftContent(Object input) { if (input instanceof ICompareInput) return ((ICompareInput) input).getLeft(); return null; } public Image getLeftImage(Object input) { if (input instanceof ICompareInput) return ((ICompareInput) input).getLeft().getImage(); return null; } public String getLeftLabel(Object input) { return Messages.CTextEditChangePreviewViewer_OrgSource; } public Object getRightContent(Object input) { if (input instanceof ICompareInput) return ((ICompareInput) input).getRight(); return null; } public Image getRightImage(Object input) { if (input instanceof ICompareInput) return ((ICompareInput) input).getRight().getImage(); return null; } public String getRightLabel(Object input) { return Messages.CTextEditChangePreviewViewer_RefactoredSource; } public boolean isLeftEditable(Object input) { return false; } public boolean isRightEditable(Object input) { return false; } public void saveLeftContent(Object input, byte[] bytes) { //No Edits } public void saveRightContent(Object input, byte[] bytes) { //No Edits } public boolean showAncestor(Object input) { //no Ancestor return false; } public void dispose() { // } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { //Nothing to do } } private static class CompareElement implements ITypedElement, IEncodedStreamContentAccessor, IResourceProvider { private static final String ENCODING= "UTF-8"; //$NON-NLS-1$ private final String fContent; private final String fType; private final IResource fResource; public CompareElement(String content, String type, IResource resource) { fContent= content; fType= type; fResource= resource; } public String getName() { return ""; //$NON-NLS-1$ } 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 void createControl(Composite parent) { CompareConfiguration compConfig = new CompareConfiguration(); compConfig.setLeftEditable(false); compConfig.setRightEditable(false); viewerPane = new CTextEditChangePane(parent, SWT.BORDER | SWT.FLAT); viewer = new CPPMergeViewer(viewerPane,SWT.MULTI | SWT.FULL_SELECTION, compConfig); textEditChangeContentProvider = new CTextEditChangePreviewViewerContentProvider(); viewer.setContentProvider(textEditChangeContentProvider); viewerPane.setContent(viewer.getControl()); } public Control getControl() { return viewerPane; } public void setInput(ChangePreviewViewerInput input) { try { Change change= input.getChange(); if (change instanceof CTextFileChange) { CTextFileChange editChange= (CTextFileChange)change; setInput(editChange, editChange.getCurrentContent(new NullProgressMonitor()), editChange.getPreviewContent(new NullProgressMonitor()), editChange.getTextType()); return; } viewer.setInput(null); } catch (CoreException e) { viewer.setInput(null); } } private void setInput(CTextFileChange change, String left, String right, String type) { IFile resource = change.getFile(); viewerPane.setText(resource.getName()); viewerPane.setImage(new CElementLabelProvider().getImage(resource)); viewer.setInput(new DiffNode( new CompareElement(left, type, resource), new CompareElement(right, type, resource))); } }