blob: fe6aa9065de2f1ddbf62c7c2c35a60866b8ddab2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2018 Borland Software Corporation and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.common.ui.launch;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jface.window.Window;
import org.eclipse.m2m.internal.qvt.oml.common.launch.TargetUriData;
import org.eclipse.m2m.internal.qvt.oml.common.launch.TargetUriData.TargetType;
import org.eclipse.m2m.internal.qvt.oml.common.ui.IModelParameterInfo;
import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfUtil;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ModelContent;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ui.choosers.IChooser;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ui.choosers.IDestinationChooser;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ui.choosers.IMetamodelHandler;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ui.choosers.MetamodelHandlerManager;
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.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
* @author sboyko
*
*/
public class UriGroupOut extends BaseUriGroup {
public UriGroupOut(Composite parent, String name, ResourceSet validationRS) {
super(parent, SWT.NONE);
myValidationRS = validationRS;
myData = new TargetUriData(""); //$NON-NLS-1$
myUpdating = false;
setLayout(new GridLayout(3, false));
{
createLabel(name, 1);
myUriText = TransformationControls.createText(this, 1);
myUriText.addModifyListener(MODIFY_LISTENER);
myUriButton = TransformationControls.createButton(this, Messages.TargetUriSelector_Browse);
myUriButton.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
if (myActiveListener != null) {
myActiveListener.widgetSelected(e);
}
}
});
}
{
createLabel(Messages.TargetUriSelector_Feature, 1);
myFeatureText = TransformationControls.createText(this, 1);
myFeatureText.addModifyListener(MODIFY_LISTENER);
myFeatureButton = TransformationControls.createButton(this, Messages.TargetUriSelector_Select);
myFeatureButton.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
if (myObject == null) {
TargetUriData oldData = new TargetUriData(myData);
EObject oldObject = myObject;
myObject = getEObject(oldData.getUriString(), oldObject);
}
if (myObject == null) {
return;
}
EStructuralFeature feature = myObject.eClass().getEStructuralFeature(myData.getFeature());
EReference initRef = feature instanceof EReference ? (EReference)feature : null;
ReferenceSelectionDialog dialog = new ReferenceSelectionDialog(myObject.eClass(), initRef, getShell(), refFilter);
if (dialog.open() == Window.OK) {
EReference ref = dialog.getReference();
myFeatureText.setText(ref.getName());
}
else {
updateData();
}
}
});
}
{
createLabel("", 1); //$NON-NLS-1$
myClearContentsCheckbox = new Button(this, SWT.CHECK);
myClearContentsCheckbox.setText(Messages.TargetUriSelector_ClearContents);
myClearContentsCheckbox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateData();
}
});
GridData gridData = new GridData();
gridData.horizontalSpan = 1;
myClearContentsCheckbox.setLayoutData(gridData);
}
initializeFrom(myData);
}
public void initializeFrom(TargetUriData targetData) {
myUpdating = true;
try {
myContentProvider = targetData.getContentProvider();
myUriText.setText(targetData.getUriString() == null ? "" : targetData.getUriString()); //$NON-NLS-1$
myFeatureText.setText(targetData.getFeature() == null ? "" : targetData.getFeature()); //$NON-NLS-1$
myClearContentsCheckbox.setSelection(targetData.isClearContents());
}
finally {
myUpdating = false;
}
updateData();
}
public TargetUriData getUriData() {
return new TargetUriData(
myData.getFeature().trim().length() == 0 ? TargetType.NEW_MODEL : myData.getTargetType(),
myData.getUriString(), myData.getFeature(), myData.isClearContents(), myContentProvider);
}
public String getText() {
return myUriText.getText();
}
public void update(String uri, String baseName, String extension, Shell shell) {
if (uri == null) {
myUriText.setEnabled(false);
myUriButton.setEnabled(false);
myActiveListener = null;
}
else {
IMetamodelHandler handler = MetamodelHandlerManager.getInstance().getHandler(uri);
if (handler == null) {
throw new RuntimeException("No handler for URI " + uri); //$NON-NLS-1$
}
else {
IChooser chooser = handler.getSourceDestChooser(myValidationRS);
((IDestinationChooser) chooser).initNewName(baseName, extension);
myActiveListener = new UriChooserListener(myUriText, chooser, shell);
myUriText.setEnabled(myContentProvider == null);
myUriButton.setEnabled(myContentProvider == null);
}
}
}
private void updateData() {
if (myUpdating) {
return;
}
try {
URI destUri = EmfUtil.makeUri(getText());
TargetType targetType = (destUri != null && EmfUtil.isUriExists(destUri, myValidationRS, true)) ? TargetType.EXISTING_CONTAINER : TargetType.NEW_MODEL;
myData = new TargetUriData(targetType,
myUriText.getText().trim(),
myFeatureText.getText(),
myClearContentsCheckbox.getSelection());
switch(myData.getTargetType()) {
case NEW_MODEL: {
myFeatureText.setEnabled(false);
myFeatureButton.setEnabled(false);
myClearContentsCheckbox.setEnabled(false);
myUriText.setEnabled(myContentProvider == null);
myUriButton.setEnabled(myContentProvider == null);
break;
}
case EXISTING_CONTAINER: {
myFeatureText.setEnabled(myContentProvider == null && myObject != null);
myFeatureButton.setEnabled(myContentProvider == null);
if (myObject != null) {
EStructuralFeature feature = myObject.eClass().getEStructuralFeature(myFeatureText.getText());
myClearContentsCheckbox.setEnabled(myContentProvider == null && feature instanceof EReference);
}
else {
myClearContentsCheckbox.setEnabled(false);
}
break;
}
case INPLACE:
myFeatureText.setEnabled(false);
myFeatureButton.setEnabled(false);
myClearContentsCheckbox.setEnabled(false);
break;
}
}
finally {
fireModified();
}
}
private EObject getEObject(String oldUri, EObject oldObject) {
boolean sameUri = oldUri == null ? myData.getUriString() == null : oldUri.equals(myData.getUriString());
EObject obj;
if (sameUri && oldObject != null) {
obj = oldObject;
}
else {
URI uri = null;
try {
uri = URI.createURI(myData.getUriString());
} catch (IllegalArgumentException e) {
}
if(uri == null) {
return null;
}
try {
ModelContent loadModel = EmfUtil.loadModel(uri, myValidationRS);
obj = (loadModel != null && !loadModel.getContent().isEmpty() ? loadModel.getContent().get(0) : null);
}
catch(Exception e) {
obj = null;
}
}
return obj;
}
public void update(String moduleName, IModelParameterInfo paramInfo, Shell shell) {
EClassifier classifier = paramInfo.getEntryParamType();
if (classifier == null) {
classifier = paramInfo.getMetamodel().eClass();
}
String extension = paramInfo.getMetamodel().getName();//EmfUtil.getExtensionForResult(classifier);
UriGroupOut.this.update(EmfUtil.getRootPackageUri(classifier),
moduleName, extension, shell);
//final EClassifier paramType = classifier;
refFilter = new ReferenceSelectionDialog.IRefFilter() {
public boolean accept(EReference ref) {
return ref.isChangeable();// && EmfUtil.isAssignableFrom(ref.getEType(), paramType);
}
};
}
private TargetUriData myData;
private TargetUriData.ContentProvider myContentProvider;
private boolean myUpdating;
private EObject myObject;
private final ResourceSet myValidationRS;
private final Text myUriText;
private final Button myUriButton;
private SelectionListener myActiveListener;
private final Text myFeatureText;
private final Button myFeatureButton;
private final Button myClearContentsCheckbox;
private final ModifyListener MODIFY_LISTENER = new ModifyListener() {
public void modifyText(ModifyEvent e) {
updateData();
}
};
private ReferenceSelectionDialog.IRefFilter refFilter = ReferenceSelectionDialog.IRefFilter.DEFAULT;
}