/******************************************************************************* | |
* Copyright (c) 2005, 2012 IBM Corporation and others. | |
* All rights reserved. This program and the accompanying materials | |
* are made available under the terms of the Eclipse Public License 2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/legal/epl-2.0/ | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
* Contributors: | |
* IBM Corporation - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.bpel.ui.dialogs; | |
import java.util.Comparator; | |
import java.util.HashMap; | |
import java.util.Map; | |
import javax.xml.namespace.QName; | |
import org.eclipse.bpel.model.BPELFactory; | |
import org.eclipse.bpel.model.Process; | |
import org.eclipse.bpel.model.Variable; | |
import org.eclipse.bpel.model.util.BPELUtils; | |
import org.eclipse.bpel.ui.Messages; | |
import org.eclipse.bpel.ui.commands.CompoundCommand; | |
import org.eclipse.bpel.ui.commands.InsertInContainerCommand; | |
import org.eclipse.bpel.ui.commands.SetNameCommand; | |
import org.eclipse.bpel.ui.commands.SetVariableTypeCommand; | |
import org.eclipse.bpel.ui.properties.PropertiesLabelProvider; | |
import org.eclipse.bpel.ui.util.BPELUtil; | |
import org.eclipse.bpel.ui.util.ModelHelper; | |
import org.eclipse.bpel.ui.util.NameDialog; | |
import org.eclipse.bpel.ui.util.NamespaceUtils; | |
import org.eclipse.bpel.ui.util.XSDUtils; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.jface.viewers.LabelProvider; | |
import org.eclipse.jface.window.Window; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.swt.widgets.Shell; | |
import org.eclipse.swt.widgets.Text; | |
import org.eclipse.ui.dialogs.FilteredList; | |
import org.eclipse.wst.wsdl.Message; | |
import org.eclipse.xsd.XSDElementDeclaration; | |
import org.eclipse.xsd.XSDTypeDefinition; | |
/** | |
* Asks the user to select a variable. | |
*/ | |
public class VariableSelectorDialog extends SelectionAndCreationDialog { | |
protected static class TypeLabelProvider extends LabelProvider { | |
@Override | |
public String getText(Object element) { | |
if (element instanceof Variable) { | |
Variable variable = (Variable)element; | |
if (variable.getMessageType() != null) { | |
Message message = variable.getMessageType(); | |
QName qname = message.getQName(); | |
String uri = NamespaceUtils.convertUriToNamespace(qname.getNamespaceURI()); | |
return uri + " - " + qname.getLocalPart(); //$NON-NLS-1$ | |
} | |
if (variable.getType() != null) { | |
return XSDUtils.getDisplayNameFromXSDType(variable.getType()); | |
} | |
if (variable.getXSDElement() != null) { | |
return variable.getXSDElement().getName(); | |
} | |
} | |
return Messages.VariableSelectorDialog_None_0; | |
} | |
} | |
/** | |
* The sort order should be: | |
* - variables with the desired type | |
* - alphabetical by name | |
*/ | |
protected class VariableComparator implements Comparator { | |
/** | |
* The given objects are the variable names. | |
*/ | |
public int compare(Object o1, Object o2) { | |
String name1 = (String)o1; | |
String name2 = (String)o2; | |
if (name1 == null || name2 == null) { | |
// neither of the names should be null but we handle it here in case that happens | |
if (name1 == null && name2 == null) return 0; | |
if (name1 == null) return 1; | |
return -1; | |
} | |
// since we are only passed the variable names, we have to use the following workaround | |
// to get the variable object | |
Variable var1 = getVariable(name1); | |
Variable var2 = getVariable(name2); | |
if (variableType != null) { | |
Object type1 = null; | |
Object type2 = null; | |
if (variableType instanceof Message) { | |
type1 = var1.getMessageType(); | |
type2 = var2.getMessageType(); | |
} else if (variableType instanceof XSDTypeDefinition) { | |
type1 = var1.getType(); | |
type2 = var2.getType(); | |
} else if (variableType instanceof XSDElementDeclaration) { | |
type1 = var1.getXSDElement(); | |
type2 = var2.getXSDElement(); | |
} | |
if (variableType.equals(type1) && !variableType.equals(type2)) return -1; | |
if (!variableType.equals(type1) && variableType.equals(type2)) return 1; | |
// if both are equal we should compare the names (bellow) | |
} | |
return name1.compareTo(name2); | |
} | |
} | |
protected EObject modelObject; | |
protected Map nameToVariable; | |
protected Variable[] variables; | |
protected EObject variableType; | |
protected Text filterText; | |
/** | |
* The modelObject is the model element that indicates the scope in which the | |
* variable should be visible. | |
*/ | |
public VariableSelectorDialog(Shell parent, EObject modelObject, EObject variableType) { | |
super(parent, new PropertiesLabelProvider(), new TypeLabelProvider()); | |
this.modelObject = modelObject; | |
this.variableType = variableType; | |
nameToVariable = new HashMap(); | |
setMessage(Messages.VariableSelectorDialog_Variable_Name_wildcards_1); | |
setUpperListLabel(Messages.VariableSelectorDialog_Matches_2); | |
setLowerListLabel(Messages.VariableSelectorDialog_Variable_Type_4); | |
refreshVariables(); | |
} | |
protected void refreshVariables() { | |
variables = BPELUtil.getVisibleVariables(modelObject); | |
setElements(variables); | |
if (fFilteredList != null) { | |
setListElements(variables); | |
} | |
} | |
@Override | |
protected FilteredList createFilteredList(Composite parent) { | |
FilteredList result = super.createFilteredList(parent); | |
result.setComparator(new VariableComparator()); | |
return result; | |
} | |
@Override | |
protected void handleNewButtonPushed() { | |
Variable variable = BPELFactory.eINSTANCE.createVariable(); | |
Process process = BPELUtils.getProcess(modelObject); | |
String newName = filterText.getText(); | |
newName = BPELUtil.generateUniqueModelName(process, newName, variable); | |
NameDialog nameDialog = new NameDialog(getShell(), Messages.VariableSelectorDialog_New_Variable_4, Messages.VariableSelectorDialog_Variable_Name_5, | |
newName, BPELUtil.getNCNameValidator()); | |
if (nameDialog.open() == Window.OK) { | |
String newVariableName = nameDialog.getValue(); | |
CompoundCommand command = new CompoundCommand(); | |
command.add(new InsertInContainerCommand(process, variable, null)); | |
command.add(new SetNameCommand(variable, newVariableName)); | |
command.add(new SetVariableTypeCommand(variable, variableType)); | |
ModelHelper.getBPELEditor(process).getCommandStack().execute(command); | |
refreshVariables(); | |
setFilter(variable.getName()); | |
setLowerSelectedElement(variable); | |
// give focus to the dialog's OK button | |
getOkButton().setFocus(); | |
} | |
} | |
/** | |
* Returns a variable from its name. | |
*/ | |
protected Variable getVariable(String name) { | |
Variable result = (Variable)nameToVariable.get(name); | |
if (result != null) return result; | |
for (int i = 0; i < variables.length; i++) { | |
if (name.equals(variables[i].getName())) { | |
nameToVariable.put(name, variables[i]); | |
return variables[i]; | |
} | |
} | |
return null; // should never happen | |
} | |
/** | |
* Returns the chosen variable or null. | |
*/ | |
public Variable getVariable() { | |
if (getResult().length > 0) { | |
return (Variable)getResult()[0]; | |
} | |
return null; | |
} | |
/** | |
* Only used to get the Text instance. | |
*/ | |
@Override | |
protected Text createFilterText(Composite parent) { | |
filterText = super.createFilterText(parent); | |
return filterText; | |
} | |
} |