blob: 90ad06bc3f43071f0c59162e1b220a5b7918268d [file] [log] [blame]
/*******************************************************************************
* 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);
}
}