/*******************************************************************************
* Copyright (c) 2013 INRIA.
* 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:
* Juan David Villa Calle - initial API and implementation
*******************************************************************************/
package fr.inria.atlanmod.emfviews.ui.common;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.presentation.EcoreEditorPlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.ui.action.LoadResourceAction.LoadResourceDialog;
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.FormAttachment;
import org.eclipse.swt.layout.FormData;
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.eclipse.emf.ecore.EPackage.Registry;
import org.eclipse.jface.dialogs.Dialog;
public class ResourceSelectionBox extends LoadResourceDialog {
private Shell shell;
private Set<EPackage> registeredPackages = new LinkedHashSet<EPackage>();
public ResourceSelectionBox(Shell parent) {
super(parent);
this.shell = parent;
}
@Override
protected boolean processResource(Resource resource) {
ResourceSet resourceSet = domain.getResourceSet();
if (!resourceSet.getResources().contains(resource)) {
Registry packageRegistry = resourceSet.getPackageRegistry();
for (EPackage ePackage : getAllPackages(resource)) {
packageRegistry.put(ePackage.getNsURI(), ePackage);
registeredPackages.add(ePackage);
}
}
return true;
}
private 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;
}
@Override
public Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
Composite buttonComposite = (Composite) composite.getChildren()[0];
Button browseRegisteredPackagesButton = new Button(buttonComposite,
SWT.PUSH);
browseRegisteredPackagesButton.setText(EcoreEditorPlugin.INSTANCE
.getString("_UI_BrowseRegisteredPackages_label")); //$NON-NLS-1$
prepareBrowseRegisteredPackagesButton(browseRegisteredPackagesButton);
FormData data = new FormData();
Control[] children = buttonComposite.getChildren();
data.left = new FormAttachment(0, 0);
data.right = new FormAttachment(children[0], -CONTROL_OFFSET);
browseRegisteredPackagesButton.setLayoutData(data);
uriField.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
String text = uriField.getText();
if (text.contains(" ")) { //$NON-NLS-1$
String[] uris = text.split(" "); //$NON-NLS-1$
if (uris.length > 0) {
uriField.setText(uris[uris.length - 1]);
}
}
}
});
return composite;
}
private void prepareBrowseRegisteredPackagesButton(
Button browseRegisteredPackagesButton) {
browseRegisteredPackagesButton
.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
RegisteredPackageDialog dialog = new RegisteredPackageDialog(
getShell());
if (dialog.open() == Dialog.OK) {
uriField.setText(dialog.getResultAsString());
}
}
});
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.common.ui.dialogs.ResourceDialog#getURIText()
*/
@Override
public String getURIText() {
String res = super.getURIText();
if (res != null && res.contains(" ")) { //$NON-NLS-1$
res = res.split(" ")[0]; //$NON-NLS-1$
}
return res;
}
/**
* Sets the dialog text.
*
* @param text
* the text
*/
public void setText(String text) {
uriField.setText(text);
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.window.Window#getShell()
*/
@Override
public Shell getShell() {
return shell;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.common.ui.dialogs.ResourceDialog#isMulti()
*/
@Override
protected boolean isMulti() {
return false;
}
}