blob: 2027eca4699cd5a72e78c330007a9a03b7464fe3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2011, 2012 Mia-Software.
* 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:
* Nicolas Bros (Mia-Software) - initial API and implementation
* Alban Ménager (Soft-Maint) - Bug 387470 - [EFacet][Custom] Editors
*******************************************************************************/
package org.eclipse.emf.facet.util.emf.ui.internal.exported.util.wizard.page;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EPackage.Registry;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.facet.util.core.DebugUtils;
import org.eclipse.emf.facet.util.emf.ui.internal.Activator;
import org.eclipse.emf.facet.util.emf.ui.internal.Messages;
import org.eclipse.emf.facet.util.emf.ui.internal.exported.util.widget.component.metaclass.MetamodelSelectionControl;
import org.eclipse.emf.facet.util.emf.ui.internal.exported.util.wizard.page.exception.SelectedEPackageRuntimeException;
import org.eclipse.emf.facet.util.emf.ui.internal.exported.wizard.page.ISelectEPackageWizardPage;
import org.eclipse.emf.facet.util.emf.ui.util.EditingUtil;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.dialogs.FilteredList;
/**
* @since 0.3
*/
public class SelectEPackageWizardPage extends WizardPage implements
ISelectEPackageWizardPage {
private static final boolean DEBUG = DebugUtils.getDebugStatus(Activator
.getDefault());
private MetamodelSelectionControl mmSelectionCtl;
public SelectEPackageWizardPage() {
super("Whatever"); //$NON-NLS-1$
setTitle(Messages.Select_EPackage);
}
@Override
public void setVisible(final boolean visible) {
super.setVisible(visible);
if (visible) {
this.mmSelectionCtl.getFilterText().setFocus();
setPageComplete(true);
}
}
public void createControl(final Composite parent) {
this.mmSelectionCtl = new MetamodelSelectionControl(parent);
this.mmSelectionCtl.setLayoutData(new GridData(
GridData.FILL_BOTH));
final FilteredList filteredList = this.mmSelectionCtl
.getFilteredList();
filteredList.addSelectionListener(new SelectionListener() {
public void widgetSelected(final SelectionEvent event) {
if (event.item != null) {
setPageComplete(filteredList.getSelection().length == 1);
}
}
public void widgetDefaultSelected(final SelectionEvent event) {
if (getWizard().canFinish()) {
getWizard().performFinish();
}
if (getNextPage() != null) {
goToNextPage();
}
}
});
// prevent the page from being "complete" when still on a previous page
filteredList.setSelection(new int[0]);
setPageComplete(false);
setControl(this.mmSelectionCtl);
}
protected void goToNextPage() {
getContainer().showPage(getNextPage());
}
public EPackage getSelectedEPackage() {
EPackage ePackage = null;
// Only one result
if (this.mmSelectionCtl.getSelectedElements() != null) {
final Object result = this.mmSelectionCtl
.getSelectedElements()[0];
if (EPackage.Registry.INSTANCE.containsKey(result.toString())) {
ePackage = EPackage.Registry.INSTANCE
.getEPackage(result.toString());
}
}
return ePackage;
}
public void loadSelectedMetamodel() {
final Object[] results = this.mmSelectionCtl
.getSelectedElements();
// if user cancel the selection of meta models, results = null
if (results != null) {
final ResourceSet resourceSet = EditingUtil.getEditingDomain()
.getResourceSet();
for (final Object result : results) {
final URI uri = URI.createURI(result.toString());
final Resource resource = resourceSet.getResource(uri, true);
if (!resourceSet.getResources().contains(resource)) {
final Registry packageRegistry = resourceSet
.getPackageRegistry();
packageRegistry.putAll(putResourceContents(resource,
packageRegistry));
resourceSet.getResources().add(resource);
}
}
}
}
private static Registry putResourceContents(final Resource resource,
final Registry packageRegistry) {
final Registry result = packageRegistry;
for (final EObject eObject : resource.getContents()) {
if (eObject instanceof EPackage) {
final EPackage ePackage = (EPackage) eObject;
result.put(ePackage.getNsURI(), ePackage);
}
}
return result;
}
/**
* Select the <code>packageName</code> into the list.
*
* @param packageName
* the name of the package to select.
*/
public void selectPackage(final String packageName) {
DebugUtils.debug(DEBUG);
boolean doItNow = true;
// We get all the jobs
for (final Job job : Job.getJobManager().find(null)) {
// We check if the job of 'FilteredList' is ended. If not, we
// recursively call this method to check again without interfering
// with the 'FilteredList' job (with an asynchrony call).
if (job.getClass().getName()
.startsWith(FilteredList.class.getName())) {
asyncSelectionPackage(packageName);
DebugUtils.debug(DEBUG, "Selection defered."); //$NON-NLS-1$
doItNow = false;
break;
}
}
// If the job 'FilteredList' is done, we can do the selection.
if (doItNow) {
internalSelectPackage(packageName);
}
}
private void asyncSelectionPackage(final String packageName) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
selectPackage(packageName);
}
});
}
private void internalSelectPackage(final String packageName) {
final FilteredList filteredList = this.mmSelectionCtl
.getFilteredList();
filteredList.setSelection(new String[] { packageName });
if (getSelectedEPackage() == null) {
throw new SelectedEPackageRuntimeException();
}
DebugUtils.debug(DEBUG, "Selection setting finished."); //$NON-NLS-1$
DebugUtils.debug(DEBUG, "selectedEPackage=" + getSelectedEPackage()); //$NON-NLS-1$
}
}