/*******************************************************************************
* Copyright (c) 2016 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.windup.ui.internal.explorer;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.commons.io.FileUtils;
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.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.jboss.tools.windup.ui.WindupUIPlugin;
import org.jboss.tools.windup.ui.internal.Messages;
/**
* Dialog for viewing a difference.
*/
public abstract class DiffDialog extends Dialog {
private static final int WIDTH = 950;
private static final int HEIGHT = 600;
private ComparePreviewer viewer;
public DiffDialog(Shell shell) {
super(shell);
}
@Override
protected Point getInitialSize() {
return new Point(WIDTH, HEIGHT);
}
@Override
protected Control createDialogArea(Composite parent) {
Control control = doCreateDialogArea(parent);
loadPreview();
return control;
}
protected Control doCreateDialogArea(Composite parent) {
Control control = super.createDialogArea(parent);
viewer = new ComparePreviewer((Composite)control);
GridDataFactory.fillDefaults().grab(true, true).applyTo(viewer.getViewer().getControl().getParent());
return control;
}
protected abstract IResource computeLeft();
protected abstract IResource computeRight();
protected void loadPreview() {
try {
IResource left = computeLeft();
IResource right = computeRight();
if (left != null && right != null) {
String leftContents = FileUtils.readFileToString(left.getLocation().toFile());
String rightContents = FileUtils.readFileToString(right.getLocation().toFile());
viewer.setInput(new DiffNode(
new CompareElement(leftContents, left.getFileExtension(), left),
new CompareElement(rightContents, left.getFileExtension(), right)));
}
else {
MessageDialog.openError(viewer.getShell(), "Quickfix Error", "Error while computing quickfix sources"); //$NON-NLS-1$
}
} catch (IOException e) {
WindupUIPlugin.log(e);
}
}
@Override
protected boolean isResizable() {
return true;
}
private static class ComparePreviewer extends CompareViewerSwitchingPane {
private CompareConfiguration fCompareConfiguration;
public ComparePreviewer(Composite parent) {
super(parent, SWT.BORDER | SWT.FLAT, true);
fCompareConfiguration= new CompareConfiguration();
fCompareConfiguration.setLeftEditable(false);
fCompareConfiguration.setLeftLabel(Messages.ComparePreviewer_original_source);
fCompareConfiguration.setRightEditable(false);
fCompareConfiguration.setRightLabel(Messages.ComparePreviewer_migrated_source);
Dialog.applyDialogFont(this);
}
@Override
protected Viewer getViewer(Viewer oldViewer, Object input) {
return CompareUI.findContentViewer(oldViewer, (ICompareInput)input, this, fCompareConfiguration);
}
@Override
public void setText(String text) {
super.setText(text);
setImage(WindupUIPlugin.getDefault().getImageRegistry().get(WindupUIPlugin.IMG_WINDUP));
}
}
private static class CompareElement implements ITypedElement, IEncodedStreamContentAccessor, IResourceProvider {
private static final String ENCODING = "UTF-8"; //$NON-NLS-1$
private String content;
private String type;
private IResource resource;
public CompareElement(String content, String type, IResource resource) {
this.content = content;
this.type = type;
this.resource = resource;
}
@Override
public String getName() {
return "";
}
@Override
public Image getImage() {
return null;
}
@Override
public String getType() {
return type;
}
@Override
public InputStream getContents() throws CoreException {
try {
return new ByteArrayInputStream(content.getBytes(ENCODING));
} catch (UnsupportedEncodingException e) {
return new ByteArrayInputStream(content.getBytes());
}
}
@Override
public String getCharset() {
return ENCODING;
}
@Override
public IResource getResource() {
return resource;
}
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IssueConstants.OK, Messages.ComparePreviewer_donePreviewFix, true);
Button button = createButton(parent, IssueConstants.APPLY_FIX, Messages.ComparePreviewer_applyFix, false);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
setReturnCode(IssueConstants.APPLY_FIX);
close();
}
});
}
}