net.enilink.komma.edit.ui.wizards.RefactorPreviewPage.java Source code

Java tutorial

Introduction

Here is the source code for net.enilink.komma.edit.ui.wizards.RefactorPreviewPage.java

Source

/*******************************************************************************
 * 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);
        }
    }
}