/*******************************************************************************
* Copyright (c) 2014 Fraunhofer IWU 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:
* Fraunhofer IWU - initial API and implementation
*******************************************************************************/
package net.enilink.komma.edit.ui.wizards;
import java.util.Collection;
import net.enilink.komma.core.IReference;
import net.enilink.komma.core.IStatement;
import net.enilink.komma.edit.refactor.Change;
import net.enilink.komma.edit.refactor.Change.StatementChange;
import net.enilink.komma.edit.refactor.Change.StatementChange.Type;
import net.enilink.komma.edit.ui.KommaEditUIPlugin;
import net.enilink.komma.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.TreeExpansionEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
public abstract class RefactorPreviewPage extends WizardPage {
protected TreeViewer treeViewer;
public RefactorPreviewPage(String pageName) {
super(pageName);
}
/**
* This method is called upon making the page visible to determine the set
* of changes that are to be previewed. It needs to be implemented by
* subclasses.
*
* @return The set of changes to preview. Should be generated using the
* RefactoringProcessor.
*/
public abstract Collection<Change> collectChanges();
static class TreeLabelProvider extends ColumnLabelProvider {
public static enum ColumnType {
RESOURCE, PROPERTY, VALUE
};
ColumnType column;
Color addBg = new Color(Display.getDefault(), 240, 255, 240);
Color removeBg = new Color(Display.getDefault(), 255, 240, 240);
public TreeLabelProvider(ColumnType column) {
this.column = column;
}
@Override
public void dispose() {
super.dispose();
addBg.dispose();
removeBg.dispose();
}
@Override
public Color getBackground(Object element) {
if (element instanceof StatementChange) {
if (((StatementChange) element).getType() == Type.ADD) {
return addBg;
} else {
return removeBg;
}
}
return null;
}
@Override
public Image getImage(Object element) {
if (element instanceof Change) {
switch (column) {
case RESOURCE:
return ExtendedImageRegistry.getInstance().getImage(
KommaEditUIPlugin.INSTANCE
.getImage("full/obj16/OWLFile.png"));
default:
return null;
}
}
return null;
}
@Override
public String getText(Object element) {
if (element instanceof Change) {
switch (column) {
case RESOURCE:
return ((Change) element).getModel().toString();
default:
return null;
}
}
if (element instanceof StatementChange) {
IStatement st = ((StatementChange) element).getStatement();
switch (column) {
case RESOURCE:
return st.getSubject().toString();
case PROPERTY:
return st.getPredicate().toString();
case VALUE:
return st.getObject().toString();
default:
return null;
}
}
return null;
}
};
@Override
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout());
final Tree tree = new Tree(composite, SWT.BORDER | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.FULL_SELECTION);
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
GridData treeGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
tree.setLayoutData(treeGridData);
treeViewer = new TreeViewer(tree);
treeViewer.setContentProvider(new ITreeContentProvider() {
@Override
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
@SuppressWarnings("unchecked")
@Override
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Collection) {
return ((Collection<Change>) inputElement).toArray();
}
return getChildren(inputElement);
}
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof Change) {
return ((Change) parentElement).getStatementChanges()
.toArray();
}
return null;
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
if (element instanceof Change) {
return true;
}
return false;
}
@Override
public void dispose() {
}
});
treeViewer.addTreeListener(new ITreeViewerListener() {
@Override
public void treeCollapsed(final TreeExpansionEvent event) {
getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
treeViewer.update(event.getElement(), null);
}
});
}
@Override
public void treeExpanded(final TreeExpansionEvent event) {
getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
treeViewer.update(event.getElement(), null);
}
});
}
});
treeViewer.setComparator(new ViewerComparator() {
@Override
public int compare(Viewer viewer, Object o1, Object o2) {
if (o1 instanceof Change && o2 instanceof Change) {
return ((Change) o1).getModel().toString()
.compareTo(((Change) o2).getModel().toString());
}
if (o1 instanceof StatementChange
&& o2 instanceof StatementChange) {
return compare(((StatementChange) o1).getStatement()
.getSubject(), ((StatementChange) o2)
.getStatement().getSubject());
}
return o1.hashCode() - o2.hashCode();
}
private int compare(IReference s1, IReference s2) {
// blank nodes at bottom
if (s1.getURI() == null) {
return (s2.getURI() == null ? s1.toString().compareTo(
s2.toString()) : 1);
}
if (s2.getURI() == null) {
return -1;
}
// compare the URIs
return s1.toString().compareTo(s2.toString());
}
});
TreeViewerColumn column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("Resource");
column.getColumn().setWidth(350);
column.setLabelProvider(new TreeLabelProvider(
TreeLabelProvider.ColumnType.RESOURCE));
column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText("Property");
column.getColumn().setWidth(350);
column.setLabelProvider(new TreeLabelProvider(
TreeLabelProvider.ColumnType.PROPERTY));
column = new TreeViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setAlignment(SWT.LEFT);
column.getColumn().setText("Value");
column.getColumn().setWidth(350);
column.setLabelProvider(new TreeLabelProvider(
TreeLabelProvider.ColumnType.VALUE));
setDescription("Preview and confirm the pending changes.");
setControl(composite);
setPageComplete(false);
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
treeViewer.setInput(collectChanges());
setPageComplete(true);
}
}
}