/*******************************************************************************
* Copyright (c) 2010-2012, Tamas Szabo, Zoltan Ujhelyi, Istvan Rath and Daniel Varro
* 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:
* Tamas Szabo, Zoltan Ujhelyi - initial API and implementation
*******************************************************************************/
package org.eclipse.incquery.tooling.ui.wizards;
import java.util.Iterator;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.incquery.tooling.core.project.IncQueryNature;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.forms.widgets.FormToolkit;
public class SelectIncQueryProjectPage extends WizardPage {
private final static class ProjectColumnLabelProvider extends ColumnLabelProvider {
private Color disabledColor;
public ProjectColumnLabelProvider(Color disabledColor) {
super();
this.disabledColor = disabledColor;
}
@Override
public String getText(Object element) {
if (element instanceof IProject) {
return ((IProject) element).getName();
}
return super.getText(element);
}
@Override
public Color getForeground(Object element) {
if (element instanceof IProject && ((IProject) element).findMember(IncQueryNature.IQGENMODEL) != null) {
return disabledColor;
}
return super.getForeground(element);
}
@Override
public String getToolTipText(Object element) {
if (element instanceof IProject && ((IProject) element).findMember(IncQueryNature.IQGENMODEL) != null) {
return String.format("Project %s has already defined an EMF-IncQuery Generator model.",
((IProject) element).getName());
}
return super.getToolTipText(element);
}
}
private final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
private IStructuredSelection selection;
private TableViewer viewer;
private Logger logger;
/**
* Create the wizard.
*/
public SelectIncQueryProjectPage(String title, IStructuredSelection selection, Logger logger) {
super("wizardPage");
this.selection = selection;
this.logger = logger;
setTitle(title);
setDescription("Select an EMF-IncQuery project without an EMF-IncQuery Generator model");
}
/**
* Create contents of the wizard.
*
* @param parent
*/
public void createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
setControl(container);
container.setLayout(new FillLayout(SWT.HORIZONTAL));
Table table = formToolkit.createTable(container, SWT.NONE);
formToolkit.paintBordersFor(table);
table.setHeaderVisible(true);
table.setLinesVisible(true);
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
viewer = new TableViewer(table);
viewer.setContentProvider(new ArrayContentProvider());
TableViewerColumn column = new TableViewerColumn(viewer, SWT.LEFT);
column.setLabelProvider(new ProjectColumnLabelProvider(parent.getDisplay().getSystemColor(SWT.COLOR_GRAY)));
viewer.addFilter(new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof IProject) {
try {
IProject project = (IProject) element;
return project.exists() && project.isOpen() && project.hasNature(IncQueryNature.NATURE_ID);
} catch (CoreException e) {
// This exception shall not come forth
logger.error("Error while filtering project list", e);
}
}
return false;
}
});
viewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
if (getContainer().getCurrentPage() != null) {
getContainer().updateButtons();
}
}
});
viewer.setInput(root.getProjects());
TableLayout layout = new TableLayout();
layout.addColumnData(new ColumnWeightData(100));
table.setLayout(layout);
Iterator<?> it = selection.iterator();
while (it.hasNext()) {
Object obj = it.next();
if (obj instanceof IResource) {
IProject containerProject = ((IResource) obj).getProject();
setSelectedProject(viewer, containerProject);
} else if (obj instanceof IAdaptable) {
IProject containerProject = ((IResource) ((IAdaptable) obj).getAdapter(IResource.class)).getProject();
setSelectedProject(viewer, containerProject);
}
}
}
private void setSelectedProject(TableViewer viewer, IProject containerProject) {
try {
if (containerProject.hasNature(IncQueryNature.NATURE_ID)) {
viewer.setSelection(new StructuredSelection(containerProject));
}
} catch (CoreException e) {
// This exception shall not come forth
logger.error("Error while selecting project " + containerProject.getName(), e);
}
}
public IProject getSelectedProject() {
if (!viewer.getSelection().isEmpty()) {
return (IProject) ((IStructuredSelection) viewer.getSelection()).getFirstElement();
}
return null;
}
@Override
public boolean isPageComplete() {
return !viewer.getSelection().isEmpty()
&& !(getSelectedProject().findMember(IncQueryNature.IQGENMODEL) != null);
}
}