package org.eclipselabs.spray.xtext.ui.wizard;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.ui.dialogs.WorkspaceResourceDialog;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.presentation.EcoreActionBarContributor.ExtendedLoadResourceAction.RegisteredPackageDialog;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipselabs.spray.xtext.util.GenModelHelper;
import com.google.inject.Inject;
public class MetamodelSelectionComposite extends Composite {
private DataBindingContext m_bindingContext;
private Text txtUri;
private Text txtGenmodelUri;
private SprayProjectInfo projectInfo;
@Inject
private GenModelHelper genmodelHelper;
/**
* Create the composite.
*
* @param parent
* @param style
*/
public MetamodelSelectionComposite(Composite parent, int style, SprayProjectInfo projectInfo) {
super(parent, style);
this.projectInfo = projectInfo;
setLayout(new GridLayout(1, false));
Group grpMetamodel = new Group(this, SWT.NONE);
GridData gd_grpMetamodel = new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1);
gd_grpMetamodel.widthHint = 600;
grpMetamodel.setLayoutData(gd_grpMetamodel);
grpMetamodel.setText("Metamodel");
grpMetamodel.setLayout(new GridLayout(2, false));
Label lblEpackage = new Label(grpMetamodel, SWT.NONE);
lblEpackage.setText("EPackage URI");
txtUri = new Text(grpMetamodel, SWT.BORDER);
txtUri.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Composite composite = new Composite(grpMetamodel, SWT.NONE);
composite.setLayout(new RowLayout(SWT.HORIZONTAL));
composite.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
Button btnNewButton = new Button(composite, SWT.NONE);
btnNewButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
RegisteredPackageDialog registeredPackageDialog = new RegisteredPackageDialog(shell);
registeredPackageDialog.setMultipleSelection(false);
registeredPackageDialog.open();
Object[] result = registeredPackageDialog.getResult();
if (result != null) {
List<?> nsURIs = Arrays.asList(result);
setNsURIs(nsURIs, txtUri, registeredPackageDialog.isDevelopmentTimeVersion(), false);
}
}
});
btnNewButton.setText("Browse Registered Packages...");
Button btnBrowseWorkspace = new Button(composite, SWT.NONE);
btnBrowseWorkspace.setText("Browse Workspace...");
btnBrowseWorkspace.addSelectionListener(new BrowseResourceSelectionAdapter(txtUri, "ecore"));
Label lblGenmodelUri = new Label(grpMetamodel, SWT.NONE);
lblGenmodelUri.setText("GenModel URI");
txtGenmodelUri = new Text(grpMetamodel, SWT.BORDER);
txtGenmodelUri.setEnabled(true);
txtGenmodelUri.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
Composite composite_1 = new Composite(grpMetamodel, SWT.NONE);
composite_1.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
composite_1.setLayout(new RowLayout(SWT.HORIZONTAL));
Button btnBrowseWorkspace_1 = new Button(composite_1, SWT.NONE);
btnBrowseWorkspace_1.setText("Browse Workspace...");
btnBrowseWorkspace_1.addSelectionListener(new BrowseResourceSelectionAdapter(txtGenmodelUri, "genmodel"));
new Label(grpMetamodel, SWT.NONE);
new Label(grpMetamodel, SWT.NONE);
m_bindingContext = initDataBindings();
txtUri.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
URI ePackageUri = URI.createURI(txtUri.getText());
if (ePackageUri.isPlatformPlugin()) {
ResourceSetImpl rs = new ResourceSetImpl();
try {
Resource r = rs.getResource(ePackageUri, true);
EPackage pck = (EPackage) r.getContents().get(0);
URI genModelUri = EcorePlugin.getEPackageNsURIToGenModelLocationMap().get(pck.getNsURI());
if (genModelUri != null) {
txtGenmodelUri.setText(genModelUri.toString());
} else {
txtGenmodelUri.setText("");
}
} catch (Exception ex) {
txtGenmodelUri.setText("");
}
} else {
// platform resource; clear genmodel
if (txtGenmodelUri.getText().length() > 0 && URI.createURI(txtGenmodelUri.getText()).isPlatformPlugin()) {
txtGenmodelUri.setText("");
}
if (ePackageUri.isPlatformResource()) {
// try to find a sibling genmodel
IPath path = new Path(ePackageUri.toString().replace("platform:/resource", "")).removeFileExtension().addFileExtension("genmodel");
if (ResourcesPlugin.getWorkspace().getRoot().findMember(path) != null) {
txtGenmodelUri.setText(URI.createPlatformResourceURI(path.toString(), true).toString());
}
}
}
}
});
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
protected void setNsURIs(List<?> nsURIs, Text uriField, boolean isDevelopmentTimeVersion, boolean append) {
if (isDevelopmentTimeVersion) {
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getURIConverter().getURIMap().putAll(EcorePlugin.computePlatformURIMap());
StringBuffer uris = new StringBuffer();
Map<String, URI> ePackageNsURItoGenModelLocationMap = EcorePlugin.getEPackageNsURIToGenModelLocationMap();
for (int i = 0, length = nsURIs.size(); i < length; i++) {
URI location = ePackageNsURItoGenModelLocationMap.get(nsURIs.get(i));
Resource resource = resourceSet.getResource(location, true);
EcoreUtil.resolveAll(resource);
}
for (Resource resource : resourceSet.getResources()) {
for (EPackage ePackage : getAllPackages(resource)) {
if (nsURIs.contains(ePackage.getNsURI())) {
uris.append(resource.getURI());
uris.append(" ");
break;
}
}
}
if (append) {
uriField.setText(uriField.getText() + ", " + uris.toString().trim());
} else {
uriField.setText(uris.toString().trim());
}
} else {
StringBuffer uris = new StringBuffer();
for (int i = 0, length = nsURIs.size(); i < length; i++) {
uris.append(nsURIs.get(i));
uris.append(" ");
}
if (append) {
uriField.setText(uriField.getText() + ", " + uris.toString().trim());
} else {
uriField.setText(uris.toString().trim());
}
}
}
protected Collection<EPackage> getAllPackages(Resource resource) {
List<EPackage> result = new ArrayList<EPackage>();
for (TreeIterator<?> j = new EcoreUtil.ContentTreeIterator<Object>(resource.getContents()) {
private static final long serialVersionUID = 1L;
@Override
protected Iterator<? extends EObject> getEObjectChildren(EObject eObject) {
return eObject instanceof EPackage ? ((EPackage) eObject).getESubpackages().iterator() : Collections.<EObject> emptyList().iterator();
}
}; j.hasNext();) {
Object content = j.next();
if (content instanceof EPackage) {
result.add((EPackage) content);
}
}
return result;
}
public SprayProjectInfo getProjectInfo() {
return projectInfo;
}
public void setProjectInfo(SprayProjectInfo projectInfo) {
this.projectInfo = projectInfo;
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
IObservableValue txtUriObserveTextObserveWidget = SWTObservables.observeText(txtUri, SWT.Modify);
IObservableValue projectInfoEpackageURIObserveValue = PojoObservables.observeValue(projectInfo, "epackageURI");
bindingContext.bindValue(txtUriObserveTextObserveWidget, projectInfoEpackageURIObserveValue, null, null);
//
IObservableValue txtGenmodelUriObserveTextObserveWidget = SWTObservables.observeText(txtGenmodelUri, SWT.Modify);
IObservableValue projectInfoGenmodelURIObserveValue = PojoObservables.observeValue(projectInfo, "genmodelURI");
bindingContext.bindValue(txtGenmodelUriObserveTextObserveWidget, projectInfoGenmodelURIObserveValue, null, null);
//
return bindingContext;
}
class BrowseResourceSelectionAdapter extends SelectionAdapter {
Text targetTextField;
String fileExtensionFilter;
public BrowseResourceSelectionAdapter(Text targetTextField, String fileExtensionFilter) {
this.targetTextField = targetTextField;
this.fileExtensionFilter = fileExtensionFilter;
}
@Override
public void widgetSelected(SelectionEvent e) {
// Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
IFile file = null;
ViewerFilter filter = new ViewerFilter() {
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (element instanceof IResource) {
IResource resource = ((IResource) element);
try {
final IJavaProject jp = (resource.getProject().getNature("org.eclipse.jdt.core.javanature") != null) ? JavaCore.create(resource.getProject()) : null;
final boolean[] select = {false}; // we need a final variable, but the value inside can be modified
resource.accept(new IResourceVisitor() {
@Override
public boolean visit(IResource resource) throws CoreException {
// filter the Java output folder
if (resource instanceof IFolder) {
if (jp != null && resource.getFullPath().equals(jp.getOutputLocation())) {
return false;
}
}
if (resource instanceof IFile) {
if (resource.getFileExtension().equals(fileExtensionFilter)) {
select[0] = true;
}
}
return true;
}
});
return select[0];
} catch (CoreException e) {
; // ignore
}
}
return true;
}
};
IFile[] files = WorkspaceResourceDialog.openFileSelection(getShell(), null, null, false, null, Collections.singletonList(filter));
if (files.length != 0) {
file = files[0];
}
if (file != null) {
URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
targetTextField.setText(uri.toString());
}
}
}
}