/*******************************************************************************
* Copyright (c) 2010-2012, Zoltan Ujhelyi, Tamas Szabo, Istvan Rath and Daniel Varro
* 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:
* Zoltan Ujhelyi, Tamas Szabo - initial API and implementation
*******************************************************************************/
package org.eclipse.incquery.tooling.ui.wizards.internal;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
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;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
/**
* A {@link Dialog} implementation for configuring one parameter of a pattern.
*
* @author Tamas Szabo
*
*/
public class ObjectParameterConfigurationDialog extends Dialog {
private static final String SELECT_A_MODEL_ELEMENT = "Select a model element (* = any string, ? = any char):";
private static final String PARAMETER_TYPE_SELECTION = "Parameter type selection";
private static final String PARAMETER_TYPE = "&Parameter type:";
private static final String PARAMETER_NAME = "&Parameter name:";
private static final String TITLE = "&Pattern parameter configuration";
private Text parameterName;
private Text parameterType;
private List<EPackage> currentPackages;
private ObjectParameter result;
protected ObjectParameterConfigurationDialog(Shell shell, List<EPackage> currentPackages, ObjectParameter result) {
super(shell);
shell.setText(TITLE);
this.currentPackages = currentPackages;
this.result = result;
}
@Override
protected Control createDialogArea(Composite parent) {
int nColumns = 4;
Composite composite = new Composite(parent, SWT.NONE);
composite.setFont(parent.getFont());
GridLayout layout = new GridLayout();
layout.numColumns = nColumns;
composite.setLayout(layout);
Label label = new Label(composite, SWT.NULL);
label.setText(PARAMETER_NAME);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 1;
label.setLayoutData(gridData);
parameterName = new Text(composite, SWT.BORDER | SWT.SINGLE);
parameterName.setText(result.getParameterName());
parameterName.setEditable(true);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 3;
parameterName.setLayoutData(gridData);
parameterName.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
result.setParameterName(parameterName.getText());
super.keyReleased(e);
}
});
label = new Label(composite, SWT.NULL);
label.setText(PARAMETER_TYPE);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 1;
label.setLayoutData(gridData);
parameterType = new Text(composite, SWT.BORDER | SWT.SINGLE);
parameterType.setText(result.getObject() == null ? "" : ((EClassifier) result.getObject()).getName());
parameterType.setEditable(false);
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 1;
parameterType.setLayoutData(gridData);
Button button = new Button(composite, SWT.PUSH);
button.setText("Browse...");
gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = 1;
button.setLayoutData(gridData);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setParameterType(openDialogBox());
}
});
return super.createDialogArea(parent);
}
/**
* Opens an element selection dialog for choosing the type of the parameter as an {@link EClassifier}.
*
* @return the type of the parameter
*/
private EClassifier openDialogBox() {
ElementListSelectionDialog listDialog = new ElementListSelectionDialog(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(), new ObjectParameterConfigurationLabelProvider());
listDialog.setTitle(PARAMETER_TYPE_SELECTION);
listDialog.setMessage(SELECT_A_MODEL_ELEMENT);
listDialog.setElements(getElements());
listDialog.open();
Object[] result = listDialog.getResult();
if (result != null && result.length > 0) {
return (EClassifier) result[0];
}
return null;
}
/**
* Returns the array of {@link EClassifier} instances based on the imported {@link EPackage}s.
*
* @return the array of {@link EClassifier}s
*/
private Object[] getElements() {
List<EObject> result = new ArrayList<EObject>();
for (EPackage _package : currentPackages) {
TreeIterator<EObject> iterator = _package.eAllContents();
while (iterator.hasNext()) {
EObject nextObject = iterator.next();
if (nextObject instanceof EClassifier) {
result.add(nextObject);
}
}
}
return result.toArray();
}
private void setParameterType(EClassifier object) {
this.result.setObject(object);
if (object != null) {
parameterType.setText(((EClassifier) object).getName());
}
}
}