/*******************************************************************************
* Copyright (c) 2007, 2015 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 v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.runtime.ui.wizards;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.m2m.internal.qvt.oml.common.MDAConstants;
import org.eclipse.m2m.internal.qvt.oml.common.MdaException;
import org.eclipse.m2m.internal.qvt.oml.common.launch.IQvtLaunchConstants;
import org.eclipse.m2m.internal.qvt.oml.common.launch.ISetMessageEx;
import org.eclipse.m2m.internal.qvt.oml.common.launch.TargetUriData;
import org.eclipse.m2m.internal.qvt.oml.common.ui.launch.IUriGroup;
import org.eclipse.m2m.internal.qvt.oml.common.ui.launch.OptionalFileGroup;
import org.eclipse.m2m.internal.qvt.oml.common.ui.launch.TraceFileControl;
import org.eclipse.m2m.internal.qvt.oml.common.ui.launch.TransformationControls;
import org.eclipse.m2m.internal.qvt.oml.emf.util.Logger;
import org.eclipse.m2m.internal.qvt.oml.emf.util.StatusUtil;
import org.eclipse.m2m.internal.qvt.oml.emf.util.WorkspaceUtils;
import org.eclipse.m2m.internal.qvt.oml.runtime.launch.QvtLaunchUtil;
import org.eclipse.m2m.internal.qvt.oml.runtime.launch.QvtValidator.ValidationType;
import org.eclipse.m2m.internal.qvt.oml.runtime.project.QvtTransformation;
import org.eclipse.m2m.internal.qvt.oml.runtime.project.QvtTransformation.TransformationParameter;
import org.eclipse.m2m.internal.qvt.oml.runtime.project.QvtTransformation.TransformationParameter.DirectionKind;
import org.eclipse.m2m.internal.qvt.oml.runtime.ui.launch.Messages;
import org.eclipse.m2m.internal.qvt.oml.runtime.ui.launch.TransformationSignatureLaunchControl;
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.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
/**
* @author sboyko
*/
public class TransformationParametersPage extends WizardPage {
public TransformationParametersPage(String pageId, ApplyTransformationData data) {
super(pageId);
setDescription(org.eclipse.m2m.internal.qvt.oml.runtime.ui.wizards.Messages.TransformationParametersPage_Description);
myData = data;
}
public void setTransformation(QvtTransformation transformation, List<TargetUriData> targetUris) {
isSkipValidation = true;
myInitialTargetUris = targetUris;
myTransformation = transformation;
if (myTransformation != null) {
setTitle(NLS.bind(org.eclipse.m2m.internal.qvt.oml.runtime.ui.wizards.Messages.TransformationParametersPage_TitleWithTransf, myTransformation));
}
if (myTransfSignatureControl != null) {
myTransfSignatureControl.setTransformation(myTransformation, myUriListeners);
}
if (myTransfSignatureControl != null && myTransformation != null) {
try {
applyTargetUris(initTargetUriData());
}
catch (MdaException e) {
}
}
myOpenEditor.setSelection(myData.isOpenResult());
if (myData.getTraceFile().length() > 0) {
myTraceFile.setText(myData.getTraceFile());
}
else {
myTraceNameNonChanged = true;
initTraceFileText();
}
myTraceFile.setUseFileFlag(myData.isUseTraceFile());
myTraceFile.setIncrementalUpdate(myData.isIncrementalUpdate());
isSkipValidation = false;
performPageValidation();
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(TransformationControls.GRID, false));
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
composite.setLayoutData(gridData);
createTransformationSection(composite);
setControl(composite);
Dialog.applyDialogFont(composite);
}
protected void createTransformationSection(Composite parent) {
myTraceFile = new TraceFileControl(parent, Messages.QvtLauncherTab_TraceFile);
myTraceFile.addModifyListener(new OptionalFileGroup.IModifyListener() {
public void modified() {
myTraceNameNonChanged = myTraceFile.getText().equals(getTraceFileName());
performPageValidation();
}});
myUriListeners.add(new IUriGroup.IModifyListener() {
public void modified() {
initTraceFileText();
performPageValidation();
}
public void performValidation(boolean isLightweight) {
validatePage(ValidationType.FULL_VALIDATION);
}
});
TransformationControls.createLabel(parent, Messages.QvtLauncherTab_ParametersLabel, TransformationControls.GRID);
myTransfSignatureControl = new TransformationSignatureLaunchControl(parent, SWT.NONE|SWT.BORDER);
TransformationControls.createLabel(parent, "", TransformationControls.GRID); //$NON-NLS-1$
myOpenEditor = new Button(parent, SWT.CHECK);
myOpenEditor.setText(org.eclipse.m2m.internal.qvt.oml.runtime.ui.wizards.Messages.ApplyTransformationFinalPage_OpenEditor);
myOpenEditor.setSelection(false);
//myOpenEditor.setVisible(false);
myOpenEditor.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
myData.setOpenResult(myOpenEditor.getSelection());
performPageValidation();
}
});
myOpenEditor.setLayoutData(new GridData());
}
private void applyTargetUris(List<TargetUriData> paramTargetUris) {
try {
ILaunchConfigurationWorkingCopy workingCopy = QvtLaunchUtil.getInMemoryLaunchConfigurationType().newInstance(null, MDAConstants.QVTO_LAUNCH_CONFIGURATION_NAME);
workingCopy.setAttribute(IQvtLaunchConstants.ELEM_COUNT, paramTargetUris.size());
int index = 1;
for (TargetUriData targetUri : paramTargetUris) {
QvtLaunchUtil.saveTargetUriData(workingCopy, targetUri, index);
++index;
}
myTransfSignatureControl.initializeFrom(workingCopy);
}
catch (CoreException e) {
Logger.getLogger().log(Logger.SEVERE, "Fail to initialize luanch configuration", e); //$NON-NLS-1$
}
}
private List<TargetUriData> initTargetUriData() throws MdaException {
URI firstUri = myInitialTargetUris.isEmpty() ? myTransformation.getURI() : myInitialTargetUris.get(0).getUri();
IFile ifile = firstUri != null ? WorkspaceUtils.getWorkspaceFile(firstUri) : null;
List<TransformationParameter> parameters = myTransformation.getParameters();
List<TargetUriData> proposedUris = new ArrayList<TargetUriData>(parameters.size());
for (int i = 0; i < parameters.size(); ++i) {
if (myInitialTargetUris.size() > i) {
proposedUris.add(myInitialTargetUris.get(i));
continue;
}
TransformationParameter transfParam = parameters.get(i);
if (transfParam.getDirectionKind() == DirectionKind.IN
|| transfParam.getDirectionKind() == DirectionKind.INOUT) {
proposedUris.add(new TargetUriData("")); //$NON-NLS-1$
continue;
}
if (ifile == null) {
proposedUris.add(new TargetUriData("")); //$NON-NLS-1$
continue;
}
try {
String extension = transfParam.getMetamodels().isEmpty() ? "xmi" : transfParam.getMetamodels().get(0).getName(); //$NON-NLS-1$
String fileName = myTransformation.getModuleName() + "." + extension; //$NON-NLS-1$
IPath targetPath = new Path(ifile.getParent().getFullPath() + "/" + fileName); //$NON-NLS-1$
URI targetUri = URI.createPlatformResourceURI(targetPath.toString(), false);
proposedUris.add(new TargetUriData(targetUri == null ? "" : targetUri.toString())); //$NON-NLS-1$
}
catch (Exception e) {
proposedUris.add(new TargetUriData("")); //$NON-NLS-1$
}
}
return proposedUris;
}
public void applyConfiguration(ILaunchConfigurationWorkingCopy workingCopy) {
myTransfSignatureControl.performApply(workingCopy);
workingCopy.setAttribute(IQvtLaunchConstants.TRACE_FILE, myTraceFile.getText());
workingCopy.setAttribute(IQvtLaunchConstants.USE_TRACE_FILE, myTraceFile.getUseFileFlag());
workingCopy.setAttribute(IQvtLaunchConstants.IS_INCREMENTAL_UPDATE, myTraceFile.isIncrementalUpdate());
myData.setTraceFile(myTraceFile.getText());
myData.setUseTraceFile(myTraceFile.getUseFileFlag());
myData.setIncrementalUpdate(myTraceFile.isIncrementalUpdate());
}
private void performPageValidation() {
if (!isSkipValidation) {
setPageComplete(validatePage(ValidationType.LIGHTWEIGHT_VALIDATION));
}
}
protected boolean validatePage(ValidationType validationType) {
if (myTransformation == null) {
return false;
}
setMessage(null);
setErrorMessage(null);
String moduleName;
try {
moduleName = myTransformation.getModuleName();
}
catch (MdaException e) {
IStatus status = StatusUtil.makeErrorStatus(e.getMessage(), e);
return TransformationControls.statusToTab(status, SET_MESSAGE);
}
if (myTraceFile.getText().length() == 0) {
myTraceFile.update(moduleName, MDAConstants.QVTO_TRACEFILE_EXTENSION);
}
IStatus status = myTransfSignatureControl.validate(moduleName, getShell(), myTraceFile.getText(),
myTraceFile.getUseFileFlag(), myTraceFile.isIncrementalUpdate(), validationType);
return TransformationControls.statusToTab(status, SET_MESSAGE);
}
private String getTraceFileName() {
URI uri = myTransfSignatureControl.getDefaultTraceName();
return uri == null ? null : uri.toString();
}
private void initTraceFileText() {
if (myTraceNameNonChanged || myTraceFile.getText().length() == 0) {
boolean oldIsSkipValidation = isSkipValidation;
isSkipValidation = true;
String traceFileName = getTraceFileName();
myTraceFile.setText(traceFileName);
//myTraceFile.setUseFileFlag(traceFileName != null);
if (traceFileName != null) {
IPath path = Path.fromOSString(traceFileName);
myTraceFile.update(path.lastSegment().replaceAll(MDAConstants.QVTO_TRACEFILE_EXTENSION_WITH_DOT, ""), //$NON-NLS-1$
MDAConstants.QVTO_TRACEFILE_EXTENSION);
}
isSkipValidation = oldIsSkipValidation;
}
}
private final ISetMessageEx SET_MESSAGE = new ISetMessageEx() {
public void setErrorMessage(String message) {
TransformationParametersPage.this.setErrorMessage(message);
}
public void setWarningMessage(String message) {
TransformationParametersPage.this.setMessage(message, WARNING);
}
public void setMessage(String message) {
TransformationParametersPage.this.setMessage(message);
}
};
private QvtTransformation myTransformation;
private final ApplyTransformationData myData;
private final List<IUriGroup.IModifyListener> myUriListeners = new ArrayList<IUriGroup.IModifyListener>(1);
private TraceFileControl myTraceFile;
private boolean myTraceNameNonChanged;
private boolean isSkipValidation;
private TransformationSignatureLaunchControl myTransfSignatureControl;
private List<TargetUriData> myInitialTargetUris;
private Button myOpenEditor;
}