/* * Copyright (c) 2006, 2009 Borland Software Corporation * * 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: * Alexander Fedorov (Borland) - initial API and implementation * Artem Tikhomirov (Borland) extra controls (templates, transformations) */ package org.eclipse.gmf.internal.bridge.transform; import java.net.MalformedURLException; import java.net.URL; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.common.util.URI; import org.eclipse.gmf.internal.bridge.genmodel.QVTDiagramGenModelTransformer; import org.eclipse.gmf.internal.bridge.ui.Plugin; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.FillLayout; 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.Event; import org.eclipse.swt.widgets.ExpandBar; import org.eclipse.swt.widgets.ExpandItem; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; /* * XXX: duplicates functionality of org.eclipse.gmf.internal.graphdef.codegen.ui.FigureGeneratorOptionsDialog */ class ViewmapProducerWizardPage extends WizardPage { private boolean myInitingControls; private Button generateRCPButton; private Button useMapModeButton; private Button useRuntimeFiguresButton; private Button useModeledViewmapButton; private Text templatesPathText; private Text qvtoFileControl; private Text preReconcileTranfsormText; private Text postReconcileTransformText; private Button radioDGMT; private Button radioQVT; private Button radioCustomQVT; private Button preReconcileTransformBtn; private Button postReconcileTransformBtn; private ExpandItem myTemplatePathItem; private ExpandItem myTransformsItem; private Composite composite; protected ViewmapProducerWizardPage(String pageName) { super(pageName); setTitle(Messages.TransformToGenModelWizard_title_options); setDescription(Messages.TransformToGenModelWizard_descr_options); } public void createControl(Composite parent) { initializeDialogUnits(parent); composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout()); createControls(composite); setControl(composite); Dialog.applyDialogFont(composite); } @Override public void setVisible(boolean visible) { super.setVisible(visible); if (visible) { initControls(); validatePage(); } } private void createControls(Composite result) { useMapModeButton = new Button(result, SWT.CHECK); useMapModeButton.setText(Messages.ViewmapProducerWizardPage_btn_mapmode); useMapModeButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_CENTER)); useRuntimeFiguresButton = new Button(result, SWT.CHECK); useRuntimeFiguresButton.setText(Messages.ViewmapProducerWizardPage_btn_runtime); useRuntimeFiguresButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_CENTER)); generateRCPButton = new Button(result, SWT.CHECK); generateRCPButton.setText(Messages.ViewmapProducerWizardPage_btn_rcp); generateRCPButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_CENTER)); useModeledViewmapButton = new Button(composite, SWT.CHECK); useModeledViewmapButton.setText(Messages.ViewmapProducerWizardPage_btnUseModeledViewmap_text); useModeledViewmapButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_CENTER)); SelectionListener selectionListener = new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { if (generateRCPButton == e.widget) { getOperation().getOptions().setGenerateRCP(generateRCPButton.getSelection()); } else if (useMapModeButton == e.widget) { getOperation().getOptions().setUseMapMode(useMapModeButton.getSelection()); } else if (useRuntimeFiguresButton == e.widget) { getOperation().getOptions().setUseRuntimeFigures(useRuntimeFiguresButton.getSelection()); } else if (useModeledViewmapButton == e.widget) { getOperation().getOptions().setInTransformationCodeGen(!useModeledViewmapButton.getSelection()); } validatePage(); } }; useMapModeButton.addSelectionListener(selectionListener); useRuntimeFiguresButton.addSelectionListener(selectionListener); generateRCPButton.addSelectionListener(selectionListener); useModeledViewmapButton.addSelectionListener(selectionListener); createAdvancedControls(result); Composite glue = new Composite(result, SWT.NONE); glue.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); } private void createAdvancedControls(Composite result) { Group parent = new Group(result, SWT.SHADOW_ETCHED_IN); parent.setText("Provisional"); parent.setLayout(new FillLayout()); parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); ExpandBar c = new ExpandBar(parent, SWT.NONE); c.setBackground(parent.getBackground()); templatesPathText = new Text(c, SWT.SINGLE | SWT.BORDER); Listener modifyListener = new Listener() { public void handleEvent(Event event) { validatePage(); } }; templatesPathText.addListener(SWT.Modify, modifyListener); myTemplatePathItem = new ExpandItem(c, SWT.NONE, 0); myTemplatePathItem.setText("GMFGraph dynamic templates"); myTemplatePathItem.setHeight(templatesPathText.computeSize(SWT.DEFAULT, SWT.DEFAULT).y); myTemplatePathItem.setControl(templatesPathText); // Composite map2genControls = new Composite(c, SWT.NONE); map2genControls.setLayout(new FillLayout(SWT.VERTICAL)); radioDGMT = new Button(map2genControls, SWT.RADIO); radioDGMT.setText("Use Java transformation"); radioQVT = new Button(map2genControls, SWT.RADIO); radioQVT.setText("Use QVTO transformation"); radioCustomQVT = new Button(map2genControls, SWT.RADIO); radioCustomQVT.setText("Use custom QVTO transformation:"); qvtoFileControl = new Text(map2genControls, SWT.SINGLE | SWT.BORDER); radioDGMT.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (event.widget == radioDGMT) { qvtoFileControl.setEditable(false); qvtoFileControl.setEnabled(false); getOperation().getOptions().setTransformation(null); } } }); radioQVT.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { if (event.widget == radioQVT) { qvtoFileControl.setEditable(false); qvtoFileControl.setEnabled(false); getOperation().getOptions().setTransformation(QVTDiagramGenModelTransformer.getDefaultTransformation()); } } }); radioCustomQVT.addListener(SWT.Selection, new Listener(){ public void handleEvent(Event event) { if (event.widget == radioCustomQVT) { qvtoFileControl.setEditable(true); qvtoFileControl.setEnabled(true); if (qvtoFileControl.getText() != null) { getOperation().getOptions().setTransformation(checkTextFieldURI(qvtoFileControl)); } } } }); qvtoFileControl.addListener(SWT.CHANGED, new Listener(){ public void handleEvent(Event event) { if (event.widget == qvtoFileControl && radioCustomQVT.getSelection() && qvtoFileControl.getText() != null) { getOperation().getOptions().setTransformation(checkTextFieldURI(qvtoFileControl)); } } }); preReconcileTransformBtn = new Button(map2genControls, SWT.CHECK); preReconcileTransformBtn.setText("Extra in-place gmfgen transformation before a reconcile step"); preReconcileTranfsormText = new Text(map2genControls, SWT.SINGLE | SWT.BORDER); postReconcileTransformBtn = new Button(map2genControls, SWT.CHECK); postReconcileTransformBtn.setText("Extra in-place gmfgen transformation after a reconcile step"); postReconcileTransformText = new Text(map2genControls, SWT.SINGLE | SWT.BORDER); preReconcileTransformBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (((Button)e.widget).getSelection()) { preReconcileTranfsormText.setEditable(true); preReconcileTranfsormText.setEnabled(true); if (preReconcileTranfsormText.getText() != null) { getOperation().getOptions().setPreReconcileTransform(checkTextFieldURI(preReconcileTranfsormText)); } } else { preReconcileTranfsormText.setEditable(true); preReconcileTranfsormText.setEnabled(true); getOperation().getOptions().setPreReconcileTransform(null); } } }); preReconcileTranfsormText.addListener(SWT.CHANGED, new Listener(){ public void handleEvent(Event event) { if (preReconcileTransformBtn.getSelection() && preReconcileTranfsormText.getText() != null) { getOperation().getOptions().setPreReconcileTransform(checkTextFieldURI(preReconcileTranfsormText)); } } }); postReconcileTransformBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (((Button)e.widget).getSelection()) { postReconcileTransformText.setEditable(true); postReconcileTransformText.setEnabled(true); if (postReconcileTransformText.getText() != null) { getOperation().getOptions().setPostReconcileTransform(checkTextFieldURI(postReconcileTransformText)); } } else { postReconcileTransformText.setEditable(true); postReconcileTransformText.setEnabled(true); getOperation().getOptions().setPostReconcileTransform(null); } } }); postReconcileTransformText.addListener(SWT.CHANGED, new Listener(){ public void handleEvent(Event event) { if (postReconcileTransformBtn.getSelection() && postReconcileTransformText.getText() != null) { getOperation().getOptions().setPostReconcileTransform(checkTextFieldURI(postReconcileTransformText)); } } }); preReconcileTranfsormText.addListener(SWT.Modify, modifyListener); postReconcileTransformText.addListener(SWT.Modify, modifyListener); String hint = "Transformation should take single inout parameter of GMFGen model type, e.g.\n\nmodeltype GMFGEN uses gmfgen('http://www.eclipse.org/gmf/2009/GenModel');\n\ntransformation %s(inout gmfgenModel : GMFGEN);\n\n main() {...}"; preReconcileTranfsormText.setToolTipText(String.format(hint, "PreReconcile")); postReconcileTransformText.setToolTipText(String.format(hint, "PostReconcile")); myTransformsItem = new ExpandItem(c, SWT.NONE, 1); myTransformsItem.setText("Map to Gen transformation"); myTransformsItem.setHeight(map2genControls.computeSize(SWT.DEFAULT, SWT.DEFAULT).y); myTransformsItem.setControl(map2genControls); } void validatePage() { if (myInitingControls) { return; } setStatus(Status.OK_STATUS); boolean hasLite = TransformOptions.checkLiteOptionPresent(); if (hasLite) { if (!useRuntimeFiguresButton.getSelection() && useMapModeButton.getSelection()) { setStatus(Plugin.createInfo(Messages.ViewmapProducerWizardPage_i_not_recommended)); } } TransformOptions options = getOperation().getOptions(); // safe to set option value now as they get flushed into storage only on Wizard.performFinish options.setFigureTemplatesPath(checkTextFieldURI(templatesPathText)); } private URL checkTextFieldURI(Text widget) { if (widget == null) { return null; } if (!widget.isEnabled()) { return null; } if (widget.getText().trim().length() > 0) { try { return new URL(guessAndResolvePathURL(widget.getText().trim())); } catch (MalformedURLException ex) { setStatus(Plugin.createWarning(ex.getMessage())); } } return null; } private void initControls() { myInitingControls = true; try { TransformOptions options = getOperation().getOptions(); generateRCPButton.setSelection(options.getGenerateRCP()); useRuntimeFiguresButton.setSelection(options.getUseRuntimeFigures()); useMapModeButton.setSelection(options.getUseMapMode()); useModeledViewmapButton.setSelection(!options.getUseInTransformationCodeGen()); if (null != options.getFigureTemplatesPath()) { templatesPathText.setText(options.getFigureTemplatesPath().toString()); // reveal the value to avoid confusion. // FIXME extract expand bar with template path as separate control and // move expand logic there (based on setInitialValue event myTemplatePathItem.setExpanded(true); } radioDGMT.setSelection(options.getMainTransformation() == null); radioQVT.setSelection(!radioDGMT.getSelection() && !radioCustomQVT.getSelection()); radioCustomQVT.setSelection(!radioDGMT.getSelection() && !radioQVT.getSelection()); qvtoFileControl.setEnabled(radioCustomQVT.getSelection()); qvtoFileControl.setText(options.getMainTransformation() != null ? options.getMainTransformation().toString() : QVTDiagramGenModelTransformer.getDefaultTransformation().toString()); preReconcileTransformBtn.setSelection(options.getPreReconcileTransform() != null); preReconcileTranfsormText.setEnabled(preReconcileTransformBtn.getSelection()); preReconcileTranfsormText.setText(options.getPreReconcileTransform() != null ? options.getPreReconcileTransform().toString() : ""); //$NON-NLS-1$ postReconcileTransformBtn.setSelection(options.getPostReconcileTransform() != null); postReconcileTransformText.setEnabled(postReconcileTransformBtn.getSelection()); postReconcileTransformText.setText(options.getPostReconcileTransform() != null ? options.getPostReconcileTransform().toString() : ""); //$NON-NLS-1$ if (radioQVT.getSelection() || radioCustomQVT.getSelection() || preReconcileTransformBtn.getSelection() || postReconcileTransformBtn.getSelection()) { myTransformsItem.setExpanded(true); } } finally { myInitingControls = false; } } private ITransformToGenModelOperation getOperation() { return ((TransformToGenModelWizard) getWizard()).getTransformOperation(); } private void setStatus(IStatus s) { if (s.isOK()) { setMessage(null); setPageComplete(true); } else { setMessage(s.getMessage(), IMessageProvider.INFORMATION); setPageComplete(s.getSeverity() < IStatus.WARNING); } } private static String guessAndResolvePathURL(String path) { assert path != null; if (path.indexOf(':') == -1) { try { URI templatesURI = URI.createPlatformResourceURI(path, true); return templatesURI.toString(); } catch (IllegalArgumentException ex) { // IGNORE. URI#validate throws IAE if path is incorrect, e.g. once user typed in "platform:" - opaquePart is illegal } } return path; } }