/******************************************************************************* | |
* 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.Map; | |
import org.eclipse.bpel.model.util.BPELUtils; | |
import org.eclipse.bpel.ui.BPELUIPlugin; | |
import org.eclipse.bpel.ui.Messages; | |
import org.eclipse.core.runtime.IStatus; | |
import org.eclipse.core.runtime.Status; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.jface.dialogs.Dialog; | |
import org.eclipse.jface.dialogs.StatusDialog; | |
import org.eclipse.swt.SWT; | |
import org.eclipse.swt.events.ModifyEvent; | |
import org.eclipse.swt.events.ModifyListener; | |
import org.eclipse.swt.layout.GridData; | |
import org.eclipse.swt.layout.GridLayout; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.swt.widgets.Control; | |
import org.eclipse.swt.widgets.Group; | |
import org.eclipse.swt.widgets.Label; | |
import org.eclipse.swt.widgets.Shell; | |
import org.eclipse.swt.widgets.Text; | |
/** | |
* A simple dialog that helps the user choose the right namespace prefix | |
* for the given namespace. | |
* | |
*/ | |
@SuppressWarnings("nls") | |
public class NamespaceMappingDialog extends StatusDialog { | |
protected static final String NS_PREFIX = "ns" ; | |
protected EObject modelObject; | |
protected Text fTargetNamespace; | |
protected Text fPrefixName; | |
protected Map<String,String> fNamespaceMappings; | |
private String fTargetNamespaceValue = ""; //$NON-NLS-1$ | |
protected String fPrefixValue = ""; //$NON-NLS-1$ | |
private NamespaceMappingDialog (Shell parent) { | |
super(parent); | |
int shellStyle = getShellStyle(); | |
setShellStyle(shellStyle | SWT.RESIZE); | |
} | |
/** | |
* The modelObject is the model element that indicates the scope in which the | |
* variable should be visible. | |
* @param parent the parent shell | |
* @param eObject the model object | |
*/ | |
public NamespaceMappingDialog (Shell parent, EObject eObject) { | |
this(parent); | |
setStatusLineAboveButtons(true); | |
this.modelObject = eObject; | |
setTitle(Messages.NamespaceMappingDialog_3); | |
computeNamespacePrefix(); | |
} | |
/** | |
* Set the target namespace for which we want to establish the prefix for. | |
* @param namespace | |
*/ | |
public void setNamespace ( String namespace ) { | |
fTargetNamespaceValue = namespace; | |
if (fTargetNamespace != null && fTargetNamespaceValue != null ) { | |
fTargetNamespace.setText( namespace ); | |
} | |
} | |
/** | |
* Compute the next available namespace prefix. | |
*/ | |
public void computeNamespacePrefix ( ) { | |
if (fNamespaceMappings == null) { | |
fNamespaceMappings = BPELUtils.getAllNamespacesForContext(modelObject); | |
} | |
String key = NS_PREFIX; | |
for(int i=1;; i++) { | |
key = NS_PREFIX + i; | |
if (fNamespaceMappings.containsKey(key) == false) { | |
break; | |
} | |
} | |
setPrefix ( key ); | |
} | |
/** | |
* Set the prefix name. | |
* @param value | |
*/ | |
public void setPrefix ( String value ) { | |
fPrefixValue = value; | |
if (fPrefixName != null && fPrefixValue != null) { | |
fPrefixName.setText(fPrefixValue); | |
validatePrefix(); | |
} | |
} | |
/** | |
* Get the prefix value | |
* | |
* @return the prefix value | |
*/ | |
public String getPrefix () { | |
return fPrefixValue; | |
} | |
/** | |
* @see Dialog#createDialogArea(Composite) | |
*/ | |
@Override | |
public Control createDialogArea(Composite parent) { | |
Composite contents = (Composite) super.createDialogArea(parent); | |
createNamespaceArea (contents); | |
return contents; | |
} | |
protected void createNamespaceArea (Composite parent) { | |
Group group = new Group(parent,SWT.SHADOW_ETCHED_IN); | |
group.setText(Messages.NamespaceMappingDialog_4); | |
GridLayout layout = new GridLayout(1,true); | |
GridData data = new GridData(); | |
data.grabExcessVerticalSpace = false; | |
data.grabExcessHorizontalSpace = true; | |
data.horizontalAlignment = GridData.FILL; | |
data.verticalAlignment = GridData.BEGINNING; | |
group.setLayout( layout ); | |
group.setLayoutData( data ); | |
Composite container = new Composite(group, SWT.NONE); | |
layout = new GridLayout(); | |
layout.makeColumnsEqualWidth = true; | |
layout.numColumns = 2; | |
container.setLayout(layout); | |
data = new GridData(); | |
data.grabExcessVerticalSpace = false; | |
data.grabExcessHorizontalSpace = true; | |
data.horizontalAlignment = GridData.FILL; | |
data.verticalAlignment = GridData.CENTER; | |
container.setLayoutData(data); | |
// Create Target namespace mappings | |
Composite namespace = new Composite(group, SWT.NONE); | |
layout = new GridLayout(); | |
layout.numColumns = 2; | |
namespace.setLayout(layout); | |
data = new GridData(); | |
data.grabExcessVerticalSpace = true; | |
data.grabExcessHorizontalSpace = true; | |
data.horizontalAlignment = GridData.FILL; | |
data.verticalAlignment = GridData.FILL; | |
namespace.setLayoutData(data); | |
Label label = new Label(namespace,SWT.NONE); | |
label.setText(Messages.NamespaceMappingDialog_5); | |
fTargetNamespace = new Text(namespace,SWT.BORDER); | |
fTargetNamespace.setEditable(false); | |
setNamespace( fTargetNamespaceValue ); | |
data = new GridData(); | |
data.grabExcessVerticalSpace = false; | |
data.grabExcessHorizontalSpace = true; | |
data.horizontalAlignment = GridData.FILL; | |
data.verticalAlignment = GridData.FILL; | |
fTargetNamespace.setLayoutData(data); | |
label = new Label(namespace,SWT.NONE); | |
label.setText(Messages.NamespaceMappingDialog_6); | |
fPrefixName = new Text(namespace,SWT.BORDER); | |
setPrefix( fPrefixValue ); | |
fPrefixName.addModifyListener( new ModifyListener () { | |
public void modifyText(ModifyEvent e) { | |
validatePrefix(); | |
} | |
}); | |
data = new GridData(); | |
data.grabExcessVerticalSpace = false; | |
data.grabExcessHorizontalSpace = true; | |
data.horizontalAlignment = GridData.FILL; | |
data.verticalAlignment = GridData.FILL; | |
fPrefixName.setLayoutData(data); | |
// End of target namespace variant. | |
} | |
void validatePrefix ( ) { | |
fPrefixValue = fPrefixName.getText(); | |
if (fPrefixValue.length() == 0 || fPrefixValue.startsWith("xml") ) { //$NON-NLS-1$ | |
// TODO: Prefix validation ? | |
updateStatus( new Status(IStatus.ERROR, | |
BPELUIPlugin.INSTANCE.getID(), | |
0, | |
Messages.NamespaceMappingDialog_8, | |
null)); | |
return; | |
} | |
if (fNamespaceMappings.containsKey(fPrefixValue)) { | |
updateStatus( new Status(IStatus.ERROR, | |
BPELUIPlugin.INSTANCE.getID(), | |
0, | |
Messages.NamespaceMappingDialog_9, | |
null)); | |
return ; | |
} | |
for(char ch : fPrefixValue.toCharArray()) { | |
if (Character.isWhitespace(ch)) { | |
updateStatus( new Status(IStatus.ERROR, | |
BPELUIPlugin.INSTANCE.getID(), | |
0, | |
Messages.NamespaceMappingDialog_8, | |
null)); | |
return ; | |
} | |
} | |
updateStatus(Status.OK_STATUS); | |
} | |
@Override | |
protected void updateStatus (IStatus status) { | |
super.updateStatus(status); | |
} | |
} |