/*******************************************************************************
* 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 java.util.Locale;
import org.eclipse.bpel.common.ui.details.DelegateIValue;
import org.eclipse.bpel.common.ui.details.FocusContext;
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.ViewerIValue;
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.BPELFactory;
import org.eclipse.bpel.model.BPELPackage;
import org.eclipse.bpel.model.Documentation;
import org.eclipse.bpel.model.BPELExtensibleElement;
import org.eclipse.bpel.model.util.BPELUtils;
import org.eclipse.bpel.ui.IHelpContextIds;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.commands.CompoundCommand;
import org.eclipse.bpel.ui.commands.SetCommand;
import org.eclipse.bpel.ui.details.providers.LanguageContentProvider;
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.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Combo;
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 DocumentationSection extends BPELPropertySection {
protected Text fSourceText;
protected StatusLabel2 fSourceLabel;
protected StatusLabel2 fLangLabel;
protected Text fDescription;
protected StatusLabel2 fDescriptionLabel;
/** The current documentation model */
protected Documentation fDocumentation;
protected Combo fLangCombo;
protected ComboViewer fLangViewer;
EditController fValueEditHelper ;
EditController fSourceEditHelper;
EditController fLangEditHelper;
IValue fContext;
BPELExtensibleElement fModelEE;
/**
* The adapter here is on the model object for this section, which is any BPELExtensibleElement
*
*/
@Override
protected MultiObjectAdapter[] createAdapters() {
return new MultiObjectAdapter[] {
/* model object */
new MultiObjectAdapter() {
@Override
public void notify (Notification n) {
if (markersHaveChanged(n)) {
updateMarkers();
return ;
}
if (n.getFeature() == BPELPackage.eINSTANCE.getBPELExtensibleElement_Documentation()) {
/** Documentation has been replaced. */
Documentation eObj = (Documentation) n.getNewValue();
if ( eObj != fDocumentation ) {
fValueEditHelper.setInput( eObj );
fSourceEditHelper.setInput( eObj );
fLangEditHelper.setInput( eObj );
fDocumentation = eObj;
}
}
}
},
};
}
CompoundCommand attachDocumentationCommand () {
CompoundCommand ccmd = null;
if (fDocumentation.eContainer() == null) {
ccmd = new CompoundCommand();
fDocumentation.setSource(fSourceText.getText());
fDocumentation.setLang(fLangCombo.getText());
fDocumentation.setValue(fDescription.getText());
ccmd.add( new SetCommand(fModelEE,fDocumentation,BPELPackage.eINSTANCE.getBPELExtensibleElement_Documentation()) );
}
return ccmd;
}
@SuppressWarnings("nls")
@Override
protected void basicSetInput (EObject input) {
saveUserContextToInput();
super.basicSetInput (input);
restoreUserContextFromInput();
if (input instanceof BPELExtensibleElement == false) {
throw new IllegalArgumentException("input must be BPELExtensibleElement");
}
fModelEE = (BPELExtensibleElement) input;
fDocumentation = fModelEE.getDocumentation();
// Create one if not there.
if (fDocumentation == null) {
fDocumentation = BPELFactory.eINSTANCE.createDocumentation();
}
fValueEditHelper.setInput(fDocumentation) ;
fSourceEditHelper.setInput(fDocumentation) ;
fLangEditHelper.setInput(fDocumentation) ;
}
@SuppressWarnings("nls")
protected void createSourceWidgets(Composite composite) {
FlatFormData data;
DecoratedLabel nameLabel = new DecoratedLabel(composite,SWT.LEFT);
fWidgetFactory.adapt(nameLabel);
nameLabel.setText(Messages.DocumentationSection_Source_1);
fSourceLabel = new StatusLabel2( nameLabel );
fSourceText = fWidgetFactory.createText(composite, EMPTY_STRING);
fSourceText.setData(FocusContext.NAME,"source");
data = new FlatFormData();
data.left = new FlatFormAttachment(IDetailsAreaConstants.HSPACE, BPELUtil.calculateLabelWidth(nameLabel, STANDARD_LABEL_WIDTH_AVG));
data.right = new FlatFormAttachment(100, -2 * IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(0, 0);
fSourceText.setLayoutData(data);
data = new FlatFormData();
data.left = new FlatFormAttachment(0,IDetailsAreaConstants.HSPACE );
data.right = new FlatFormAttachment(fSourceText, 0);
data.top = new FlatFormAttachment(fSourceText, 0, SWT.CENTER);
nameLabel.setLayoutData(data);
}
@SuppressWarnings("nls")
protected void createLanguageWidgets(Composite composite) {
FlatFormData data;
DecoratedLabel nameLabel = new DecoratedLabel(composite,SWT.LEFT);
fWidgetFactory.adapt(nameLabel);
nameLabel.setText(Messages.DocumentationSection_Language_1);
fLangLabel = new StatusLabel2( nameLabel );
fLangCombo = new Combo(composite, SWT.READ_ONLY);
fWidgetFactory.adapt(fLangCombo);
fLangCombo.setData(FocusContext.NAME,"language");
fLangViewer = new ComboViewer(fLangCombo);
fLangViewer.setContentProvider(new LanguageContentProvider());
fLangViewer.setLabelProvider( new ILabelProvider () {
public Image getImage(Object element) {
return null;
}
public String getText(Object element) {
Locale locale = (Locale) element;
return locale.getDisplayName();
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
});
fLangViewer.setInput(Locale.getDefault());
// Combo
data = new FlatFormData();
data.left = new FlatFormAttachment(IDetailsAreaConstants.HSPACE, BPELUtil.calculateLabelWidth(nameLabel, STANDARD_LABEL_WIDTH_AVG));
// data.right = new FlatFormAttachment(100,-2 * IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(fSourceLabel.getControl(), IDetailsAreaConstants.HSPACE);
fLangCombo.setLayoutData(data);
// Label
data = new FlatFormData();
data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE);
data.right = new FlatFormAttachment(fLangCombo, 0 );
data.top = new FlatFormAttachment(fLangCombo, 0, SWT.CENTER);
nameLabel.setLayoutData(data);
}
@SuppressWarnings("nls")
protected void createDescriptionWidgets (Composite composite) {
FlatFormData data;
DecoratedLabel nameLabel = new DecoratedLabel(composite,SWT.LEFT);
fWidgetFactory.adapt(nameLabel);
nameLabel.setText(Messages.DocumentationSection_Description_1);
fDescriptionLabel = new StatusLabel2( nameLabel );
fDescription = fWidgetFactory.createText(composite, EMPTY_STRING , SWT.V_SCROLL | SWT.MULTI );
fDescription.setData(FocusContext.NAME,"description");
// description
data = new FlatFormData();
data.left = new FlatFormAttachment(IDetailsAreaConstants.HSPACE, BPELUtil.calculateLabelWidth(nameLabel, STANDARD_LABEL_WIDTH_AVG));
data.right = new FlatFormAttachment(100, -2 * IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(fLangCombo, IDetailsAreaConstants.HSPACE );
data.bottom = new FlatFormAttachment(100, -3*IDetailsAreaConstants.VSPACE);
fDescription.setLayoutData(data);
// label
data = new FlatFormData();
data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE );
data.right = new FlatFormAttachment(fDescription, -IDetailsAreaConstants.HSPACE);
data.top = new FlatFormAttachment(fDescription, IDetailsAreaConstants.VSPACE, SWT.TOP);
nameLabel.setLayoutData(data);
}
@Override
protected EditController createEditController() {
return new EditController(getCommandFramework()) {
@Override
public Command createApplyCommand() {
CompoundCommand cmd = attachDocumentationCommand();
if (cmd != null) {
cmd.add (super.createApplyCommand());
return wrapInShowContextCommand (cmd);
}
return wrapInShowContextCommand (super.createApplyCommand() ) ;
}
};
}
protected void createChangeTrackers() {
/** Value Edit Helper */
fValueEditHelper = createEditController() ;
fValueEditHelper.setFeature( BPELPackage.eINSTANCE.getDocumentation_Value() );
fValueEditHelper.setViewIValue(new TextIValue ( fDescription ) );
fValueEditHelper.startListeningTo(fDescription);
/** Source Edit Helper */
fSourceEditHelper = createEditController() ;
fSourceEditHelper.setFeature( BPELPackage.eINSTANCE.getDocumentation_Source() );
fSourceEditHelper.setViewIValue( new TextIValue ( fSourceText ) );
fSourceEditHelper.startListeningTo(fSourceText);
/** Language Edit Helper */
fLangEditHelper = createEditController() ;
fLangEditHelper.setFeature( BPELPackage.eINSTANCE.getDocumentation_Lang() );
fLangEditHelper.setViewIValue( new DelegateIValue( new ViewerIValue ( fLangViewer )) {
@Override
public Object get() {
Locale locale = (Locale) fDelegate.get() ;
return locale.getLanguage();
}
@Override
public void set(Object object) {
fDelegate.set( BPELUtils.lookupLocaleFor( (String) object ));
}
});
fLangEditHelper.startListeningTo( fLangCombo );
}
@Override
protected void createClient(Composite parent) {
Composite composite = createFlatFormComposite(parent);
createSourceWidgets(composite);
createLanguageWidgets(composite);
createDescriptionWidgets(composite);
fContext = new FocusContext( fDescription, fSourceText, fLangCombo );
createChangeTrackers();
PlatformUI.getWorkbench().getHelpSystem().setHelp( composite, IHelpContextIds.PROPERTY_PAGE_DOCUMENTATION);
}
/**
* @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#shouldUseExtraSpace()
*/
@Override
public boolean shouldUseExtraSpace() {
return true;
}
@Override
protected void updateMarkers () {
fSourceLabel.clear();
for(IMarker m : getMarkers(getInput())) {
fSourceLabel.addStatus( BPELUtil.adapt(m, IStatus.class) );
}
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#getUserContext()
*/
@Override
public Object getUserContext() {
return fContext.get();
}
/**
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#restoreUserContext(java.lang.Object)
*/
@Override
public void restoreUserContext (Object userContext) {
fContext.set( userContext );
}
/**
* 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) {
// fDescription.setFocus() ;
}
/**
*
* @see org.eclipse.bpel.ui.properties.BPELPropertySection#isValidMarker(org.eclipse.core.resources.IMarker)
*/
@Override
public boolean isValidMarker (IMarker marker) {
return false;
}
}