/******************************************************************************* | |
* 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 v1.0 | |
* which accompanies this distribution, and is available at | |
* http://www.eclipse.org/legal/epl-v10.html | |
* | |
* Contributors: | |
* IBM Corporation - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.bpel.ui.properties; | |
import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants; | |
import org.eclipse.bpel.common.ui.details.IValue; | |
import org.eclipse.bpel.common.ui.details.TextIValue; | |
import org.eclipse.bpel.common.ui.details.widgets.DecoratedLabel; | |
import org.eclipse.bpel.common.ui.details.widgets.StatusLabel2; | |
import org.eclipse.bpel.common.ui.flatui.FlatFormAttachment; | |
import org.eclipse.bpel.common.ui.flatui.FlatFormData; | |
import org.eclipse.bpel.model.BPELPackage; | |
import org.eclipse.bpel.ui.BPELUIPlugin; | |
import org.eclipse.bpel.ui.IHelpContextIds; | |
import org.eclipse.bpel.ui.Messages; | |
import org.eclipse.bpel.ui.adapters.INamedElement; | |
import org.eclipse.bpel.ui.util.BPELUtil; | |
import org.eclipse.bpel.ui.util.MultiObjectAdapter; | |
import org.eclipse.core.resources.IMarker; | |
import org.eclipse.core.runtime.IStatus; | |
import org.eclipse.core.runtime.Status; | |
import org.eclipse.emf.common.notify.Notification; | |
import org.eclipse.emf.common.util.EList; | |
import org.eclipse.emf.ecore.EAttribute; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.gef.commands.Command; | |
import org.eclipse.osgi.util.NLS; | |
import org.eclipse.swt.SWT; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.swt.widgets.Text; | |
import org.eclipse.ui.PlatformUI; | |
/** | |
* Details section for the "name" property (which is common to most BPEL elements). | |
*/ | |
@SuppressWarnings("boxing") | |
public class NameSection extends BPELPropertySection { | |
protected Text fNameText; | |
protected StatusLabel2 statusLabel; | |
protected EditController fNameEditController; | |
INamedElement fNamedElement; | |
@Override | |
protected MultiObjectAdapter[] createAdapters() { | |
return new MultiObjectAdapter[] { | |
/* model object */ | |
new MultiObjectAdapter() { | |
@Override | |
public void notify (Notification n) { | |
if (markersHaveChanged(n)) { | |
updateMarkers(); | |
return ; | |
} | |
} | |
}, | |
}; | |
} | |
@Override | |
protected void basicSetInput (EObject input) { | |
super.basicSetInput(input); | |
fNamedElement = BPELUtil.adapt(input,INamedElement.class); | |
fNameEditController.setInput(input); | |
} | |
protected void createNameWidgets(Composite composite) { | |
FlatFormData data; | |
DecoratedLabel nameLabel = new DecoratedLabel(composite,SWT.LEFT); | |
fWidgetFactory.adapt(nameLabel); | |
nameLabel.setText(Messages.NameDetails_BPEL_Name__3); | |
statusLabel = new StatusLabel2( nameLabel ); | |
fNameText = fWidgetFactory.createText(composite, EMPTY_STRING); | |
data = new FlatFormData(); | |
data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(nameLabel, STANDARD_LABEL_WIDTH_AVG)); | |
data.right = new FlatFormAttachment(100, (-2) * IDetailsAreaConstants.HSPACE ); | |
data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE ); | |
fNameText.setLayoutData(data); | |
data = new FlatFormData(); | |
data.left = new FlatFormAttachment(0, 0); | |
data.right = new FlatFormAttachment(fNameText, -IDetailsAreaConstants.HSPACE); | |
data.top = new FlatFormAttachment(fNameText, 0, SWT.CENTER); | |
nameLabel.setLayoutData(data); | |
} | |
protected void createChangeTrackers() { | |
// fChangeHelper = new ChangeHelper ( getCommandFramework() ) { | |
// public String getLabel() { | |
// return IBPELUIConstants.CMD_EDIT_NAME; | |
// } | |
// public Command createApplyCommand() { | |
// | |
// final String newName = fNameText.getText().trim(); | |
// | |
// if (newName.length() == 0 || newName.equals(namedElement.getName(getModel()))) { | |
// return null; // there is nothing to be done | |
// } | |
// | |
// return wrapInShowContextCommand( | |
// new UpdateModelCommand(getInput(), getLabel() ) { | |
// @Override | |
// public void doExecute() { | |
// namedElement.setName(fTarget, newName); | |
// } | |
// }); | |
// } | |
// | |
// public void restoreOldState() { | |
// updateNameWidgets(); | |
// } | |
// }; | |
// | |
// fChangeHelper.startListeningTo(fNameText); | |
// | |
/** TODO: Empty Name should never be set */ | |
fNameEditController = new EditController(getCommandFramework()) { | |
@Override | |
public boolean checkNotification (Notification notification) { | |
return fNamedElement != null && fNamedElement.isNameAffected(fNameEditController.getInput(), notification); | |
} | |
@Override | |
public Command createApplyCommand() { | |
return wrapInShowContextCommand( super.createApplyCommand() ); | |
} | |
}; | |
fNameEditController.setLabel( BPELPackage.eINSTANCE.getActivity_Name().getName() ); | |
fNameEditController.setViewIValue(new TextIValue ( fNameText )) ; | |
fNameEditController.setModeIValue(new IValue () { | |
public Object get() { | |
return fNamedElement != null ? fNamedElement.getName( fNameEditController.getInput() ) : null; | |
} | |
public void set (Object object) { | |
if (fNamedElement != null) { | |
fNamedElement.setName(fNameEditController.getInput(),object.toString() ); | |
} | |
} | |
}); | |
fNameEditController.startListeningTo(fNameText); | |
} | |
@Override | |
protected void createClient(Composite parent) { | |
Composite composite = createFlatFormComposite(parent); | |
createNameWidgets(composite); | |
createChangeTrackers(); | |
PlatformUI.getWorkbench().getHelpSystem().setHelp( | |
composite, IHelpContextIds.PROPERTY_PAGE_NAME); | |
} | |
@Override | |
protected void updateMarkers () { | |
statusLabel.clear(); | |
for(IMarker m : getMarkers(getInput())) { | |
statusLabel.addStatus( BPELUtil.adapt(m, IStatus.class) ); | |
} | |
} | |
protected IStatus validate() { | |
// IStatus status = ValidationHelper.validateXML_NCName(nameText.getText()); | |
//if (status.isOK()) | |
return validate(getInput()); | |
//else | |
// return status; | |
} | |
protected IStatus validate (Object currentElement ) { | |
if (currentElement instanceof EObject) { // i.e. PartnerLink,Variable, Correlation Set, etc. | |
EObject elm = (EObject) currentElement; | |
EObject elmContainer = elm.eContainer(); | |
if (elmContainer != null) { | |
EList el = elmContainer.eContents(); | |
for(int i=0, j=el.size() ; i < j; i++) { | |
Object next = el.get(i); | |
if ((next instanceof EObject) == false) { | |
continue; | |
} | |
EObject loopElement = (EObject) next; | |
EAttribute eAttribute = getNAMEAttribute(loopElement.eClass().getEAllAttributes() ); | |
if (eAttribute != null) { | |
Object name = loopElement.eGet(eAttribute); | |
if (name != null) { | |
// is there another element with the same name? | |
if (name.equals(fNameText.getText()) && !loopElement.equals(currentElement)) { | |
String message = NLS.bind(Messages.NameDetails_RenameErrorMessage, (new Object[] {fNameText.getText()})); | |
return new Status( IStatus.ERROR, BPELUIPlugin.PLUGIN_ID, IStatus.ERROR, message, null); | |
} | |
} | |
} | |
} | |
} | |
} | |
return new Status( IStatus.OK, BPELUIPlugin.PLUGIN_ID, IStatus.OK, "Hi There", null); //$NON-NLS-1$ | |
} | |
protected EAttribute getNAMEAttribute(EList list) { | |
if (list != null) { | |
for (int i = 0; i < list.size();i++) { | |
EObject eo = (EObject)list.get(i); | |
if (eo instanceof EAttribute) { | |
EAttribute ea = (EAttribute)eo; | |
if (ea.getName().equalsIgnoreCase("name")) { //$NON-NLS-1$ | |
return (EAttribute)eo; | |
} | |
} | |
} | |
} | |
return null; | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#getUserContext() | |
*/ | |
@Override | |
public Object getUserContext() { | |
return null; | |
} | |
/** | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#restoreUserContext(java.lang.Object) | |
*/ | |
@Override | |
public void restoreUserContext(Object userContext) { | |
fNameText.setFocus(); | |
} | |
/** | |
* Goto the specific marker. This is only called when isValidMarker | |
* returns true. | |
* | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#gotoMarker(org.eclipse.core.resources.IMarker) | |
*/ | |
@Override | |
public void gotoMarker (IMarker marker) { | |
fNameText.setFocus() ; | |
} | |
/** | |
* | |
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#isValidMarker(org.eclipse.core.resources.IMarker) | |
*/ | |
@Override | |
public boolean isValidMarker (IMarker marker) { | |
String context = null; | |
try { | |
context = (String) marker.getAttribute("href.context"); | |
} catch (Exception ex) { | |
return false; | |
} | |
return "name".equals (context); | |
} | |
} |