blob: 3283b2c5bf0779728c462d262934fc938c5371fc [file] [log] [blame]
/**
*
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S. and other
* 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:
* Thales Corporate Services S.A.S - initial API and implementation
* XiaoRu Chen, Soyatec
* Xavier Maysonnave, Soyatec
*
*/
package org.eclipse.egf.core.ui.dialogs;
import java.util.Map;
import org.eclipse.egf.common.helper.EMFHelper;
import org.eclipse.egf.core.EGFCorePlugin;
import org.eclipse.egf.core.domain.TargetPlatformResourceSet;
import org.eclipse.egf.core.genmodel.IPlatformGenModel;
import org.eclipse.egf.core.ui.EGFCoreUIPlugin;
import org.eclipse.egf.core.ui.l10n.CoreUIMessages;
import org.eclipse.emf.common.ui.CommonUIPlugin;
import org.eclipse.emf.common.ui.dialogs.ResourceDialog;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
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.domain.EditingDomain;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
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.swt.widgets.Text;
/**
*
* @author XiaoRu Chen - Soyatec
*
*/
public class TargetPlatformEcoreDialog extends ResourceDialog {
protected boolean _workspace;
protected boolean _fileSystem;
protected boolean _multi;
protected EditingDomain _domain;
private boolean _packageNsURI;
private boolean _genmodelURI;
public TargetPlatformEcoreDialog(Shell parent) {
this(parent, null, false, false, true, true, true);
}
public TargetPlatformEcoreDialog(Shell parent, EditingDomain domain) {
this(parent, domain, false, false, true, true, true);
}
public TargetPlatformEcoreDialog(Shell parent, boolean packageNsURI, boolean genmodelURI, boolean multi, boolean workspace, boolean fileSystem) {
this(parent, null, packageNsURI, genmodelURI, multi, workspace, fileSystem);
}
public TargetPlatformEcoreDialog(Shell parent, EditingDomain domain, boolean packageNsURI, boolean genmodelURI, boolean multi, boolean workspace, boolean fileSystem) {
super(parent, packageNsURI ? CoreUIMessages._UI_BrowseRegisteredPackages_title : CoreUIMessages._UI_BrowseResource_title, multi ? SWT.OPEN | SWT.MULTI : SWT.OPEN | SWT.SINGLE);
_packageNsURI = packageNsURI;
_domain = domain;
_multi = multi;
_workspace = workspace;
_fileSystem = fileSystem;
_genmodelURI = genmodelURI;
}
@Override
protected boolean processResources() {
if (_domain != null) {
for (URI uri : getURIs()) {
try {
if (processResource(_domain.getResourceSet().getResource(uri, true)) == false) {
return false;
}
} catch (RuntimeException re) {
EGFCoreUIPlugin.getDefault().logError(NLS.bind(CoreUIMessages.ModelSelection_errorMessage, uri));
}
}
}
return true;
}
protected boolean processResource(Resource resource) {
return true;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
updateComposite(composite);
Composite buttonComposite = (Composite) composite.getChildren()[0];
Button browseRegisteredPackagesButton = new Button(buttonComposite, SWT.PUSH);
browseRegisteredPackagesButton.setText(CoreUIMessages._UI_BrowseRegisteredPackages_label);
prepareBrowseRegisteredPackagesButton(browseRegisteredPackagesButton);
{
FormData data = new FormData();
Control[] children = buttonComposite.getChildren();
data.right = new FormAttachment(children[0], -CONTROL_OFFSET);
browseRegisteredPackagesButton.setLayoutData(data);
}
return composite;
}
private void updateComposite(Composite composite) {
for (Control control : composite.getChildren()) {
if (control instanceof Button) {
Button button = (Button) control;
if (CommonUIPlugin.INSTANCE.getString("_UI_BrowseFileSystem_label").equals(button.getText()) && _fileSystem == false) { //$NON-NLS-1$
button.setVisible(false);
} else if (CommonUIPlugin.INSTANCE.getString("_UI_BrowseWorkspace_label").equals(button.getText()) && _workspace == false) { //$NON-NLS-1$
button.setVisible(false);
}
} else if (control instanceof Text) {
Text text = (Text) control;
if (CommonUIPlugin.INSTANCE.getString(isMulti() ? "_UI_ResourceURIs_label" : "_UI_ResourceURI_label").equals(text.getText())) { //$NON-NLS-1$ //$NON-NLS-2$
if (_packageNsURI) {
if (_multi) {
text.setText(CoreUIMessages._UI_PackageURIs_label);
} else {
text.setText(CoreUIMessages._UI_PackageURI_label);
}
}
}
} else if (control instanceof Composite) {
updateComposite((Composite) control);
}
}
}
protected void prepareBrowseRegisteredPackagesButton(Button browseRegisteredPackagesButton) {
browseRegisteredPackagesButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
TargetPlatformPackageDialog dialog = new TargetPlatformPackageDialog(getShell(), _multi);
if (dialog.open() != Window.OK) {
return;
}
IPlatformGenModel[] result = dialog.getSelectedPlatformGenModels();
if (result == null) {
return;
}
StringBuffer uris = new StringBuffer();
if (_packageNsURI) {
for (int i = 0, length = result.length; i < length; i++) {
uris.append(result[i]);
uris.append(" "); //$NON-NLS-1$
}
uriField.setText(""); //$NON-NLS-1$
uriField.setText((uriField.getText() + " " + uris.toString()).trim()); //$NON-NLS-1$
} else if (_genmodelURI) {
Map<URI, URI> ePackageNsURItoGenModelLocationMap = EGFCorePlugin.getTargetPlatformGenModelLocationMap();
for (int i = 0, length = result.length; i < length; i++) {
if (result[i].getURI() == null) {
EGFCoreUIPlugin.getDefault().logWarning(NLS.bind(CoreUIMessages._UI_No_Associated_GenModel, result[i].getNsURI()));
continue;
}
URI location = ePackageNsURItoGenModelLocationMap.get(result[i].getURI());
if (location != null) {
uris.append(location);
uris.append(" "); //$NON-NLS-1$
}
}
if (uris.length() != 0) {
uriField.setText(""); //$NON-NLS-1$
uriField.setText((uriField.getText() + " " + uris.toString()).trim()); //$NON-NLS-1$
}
} else {
ResourceSet resourceSet = new TargetPlatformResourceSet();
Map<URI, URI> ePackageNsURItoGenModelLocationMap = EGFCorePlugin.getTargetPlatformGenModelLocationMap();
for (int i = 0, length = result.length; i < length; i++) {
if (result[i].getURI() == null) {
EGFCoreUIPlugin.getDefault().logWarning(NLS.bind(CoreUIMessages._UI_No_Associated_GenModel, result[i].getNsURI()));
continue;
}
URI location = ePackageNsURItoGenModelLocationMap.get(result[i].getURI());
Resource resource = resourceSet.getResource(location, true);
if (resource != null) {
EcoreUtil.resolveAll(resource);
}
}
for (Resource resource : resourceSet.getResources()) {
LOOP: for (EPackage ePackage : EMFHelper.getAllPackages(resource)) {
for (int i = 0, length = result.length; i < length; i++) {
if (result[i].getURI().toString().equals(ePackage.getNsURI())) {
URI resourceUri = resource.getURI();
uris.append(resourceUri);
uris.append(" "); //$NON-NLS-1$
continue LOOP;
}
}
}
}
if (uris.length() != 0) {
uriField.setText(""); //$NON-NLS-1$
uriField.setText((uriField.getText() + " " + uris.toString()).trim()); //$NON-NLS-1$
}
}
}
});
}
}