/****************************************************************************** * Copyright (c) 2009-2013, Linagora * * 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: * Linagora - initial API and implementation *******************************************************************************/ package com.ebmwebsourcing.petals.services.su.editor; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Properties; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.common.command.BasicCommandStack; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.databinding.edit.EMFEditObservables; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.impl.EPackageRegistryImpl; import org.eclipse.emf.edit.command.MoveCommand; import org.eclipse.emf.edit.command.RemoveCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.transaction.ResourceSetChangeEvent; import org.eclipse.emf.transaction.ResourceSetListenerImpl; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.jface.databinding.viewers.ViewersObservables; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.IWizard; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.forms.widgets.Form; import org.eclipse.ui.forms.widgets.FormText; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.ScrolledPageBook; import org.w3c.dom.Document; import com.ebmwebsourcing.petals.common.internal.provisional.formeditor.ISharedEdition; import com.ebmwebsourcing.petals.common.internal.provisional.swt.DefaultSelectionListener; import com.ebmwebsourcing.petals.common.internal.provisional.swt.OpenSourceEditorHyperlinkListener; import com.ebmwebsourcing.petals.common.internal.provisional.utils.DomUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.JbiXmlUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.PetalsImages; import com.ebmwebsourcing.petals.common.internal.provisional.utils.StringUtils; import com.ebmwebsourcing.petals.common.internal.provisional.utils.SwtFactory; import com.ebmwebsourcing.petals.services.Messages; import com.ebmwebsourcing.petals.services.PetalsServicesPlugin; import com.ebmwebsourcing.petals.services.su.editor.extensibility.EditorContributionSupport; import com.ebmwebsourcing.petals.services.su.editor.extensibility.InitializeModelExtensionCommand; import com.ebmwebsourcing.petals.services.su.editor.extensibility.JbiEditorDetailsContribution; import com.ebmwebsourcing.petals.services.su.editor.extensibility.defaultpages.DefaultJbiEditorContribution; import com.ebmwebsourcing.petals.services.su.editor.su.EMFPCStyledLabelProvider; import com.ebmwebsourcing.petals.services.su.editor.wizards.AddConsumesToExistingJbiStrategy; import com.ebmwebsourcing.petals.services.su.editor.wizards.AddProvidesToExistingJbiStrategy; import com.ebmwebsourcing.petals.services.su.extensions.ComponentVersionDescription; import com.ebmwebsourcing.petals.services.su.extensions.ExtensionManager; import com.ebmwebsourcing.petals.services.su.jbiproperties.PetalsSPPropertiesManager; import com.ebmwebsourcing.petals.services.su.wizards.AbstractServiceUnitWizard; import com.ebmwebsourcing.petals.services.su.wizards.FinishServiceCreationStrategy; import com.ebmwebsourcing.petals.services.su.wizards.PetalsMode; import com.sun.java.xml.ns.jbi.AbstractEndpoint; import com.sun.java.xml.ns.jbi.Consumes; import com.sun.java.xml.ns.jbi.Jbi; import com.sun.java.xml.ns.jbi.JbiPackage; import com.sun.java.xml.ns.jbi.Provides; /** * The composite to display in the JBI form editor for service-units. * @author Mickael Istria - EBM WebSourcing * @author Vincent Zurczak - EBM WebSourcing */ public class SuEditionComposite extends SashForm implements ISharedEdition { private final ISharedEdition ise; private AbstractEndpoint selectedEndpoint; private EList<? extends AbstractEndpoint> containmentList; private JbiEditorDetailsContribution componentContributions; private Composite mainDetails, advancedDetails; private TableViewer providesViewer, consumesViewer; private final LabelProvider labelProvider; /** * Constructor. * @param parent */ public SuEditionComposite( Composite parent, ISharedEdition ise ) { super( parent, SWT.NONE ); this.ise = ise; this.labelProvider = new EMFPCStyledLabelProvider( this ); setLayoutData ( new GridData( GridData.FILL_BOTH )); getFormToolkit().adapt( this ); getFormToolkit().paintBordersFor( this ); // Create the widgets initModel(); createLeftWidgets(); createRightWidgets(); setWeights( new int[]{ 1, 1 }); // Initial selection AbstractEndpoint ae = null; TableViewer viewer = null; if( ! getJbiModel().getServices().getProvides().isEmpty()) { ae = getJbiModel().getServices().getProvides().get( 0 ); viewer = this.providesViewer; } else if( ! getJbiModel().getServices().getConsumes().isEmpty()) { ae = getJbiModel().getServices().getConsumes().get( 0 ); viewer = this.consumesViewer; } if( viewer != null ) { viewer.setSelection( new StructuredSelection( ae )); viewer.getTable().notifyListeners( SWT.Selection, new Event()); } } /* * (non-Javadoc) * @see org.eclipse.swt.widgets.Widget * #dispose() */ @Override public void dispose() { if( this.labelProvider != null ) this.labelProvider.dispose(); super.dispose(); } /** * Initializes the model. */ private void initModel() { // Sort the packages: the CDK must be the first one. // Components must follow. ArrayList<EPackage> cdkPackages = new ArrayList<EPackage> (); ArrayList<EPackage> componentPackages = new ArrayList<EPackage> (); for( ComponentVersionDescription description : ExtensionManager.INSTANCE.findAllComponentVersionDescriptions()) { EPackage extensionPackage = EPackageRegistryImpl.INSTANCE.getEPackage( description.getNamespace()); if( extensionPackage == null ) continue; // PetalsServicesPlugin.log( "No package for " + description.getComponentName(), IStatus.ERROR ); if( extensionPackage.getNsURI() == null ) PetalsServicesPlugin.log( "Ignoring an empty package in the SU editor.", IStatus.ERROR ); else if( extensionPackage.getNsURI().toLowerCase().contains( "components/extensions/" )) cdkPackages.add( extensionPackage ); else componentPackages.add( extensionPackage ); } ArrayList<EPackage> sortedPackages = new ArrayList<EPackage> (); sortedPackages.addAll( cdkPackages ); sortedPackages.addAll( componentPackages ); // Create and invoke the command Set<String> pagesPackages = new HashSet<String> (); CompoundCommand initializeCommand = new CompoundCommand(); for( EPackage extensionPackage : sortedPackages ) { if( pagesPackages.contains( extensionPackage.getNsURI())) continue; pagesPackages.add( extensionPackage.getNsURI()); InitializeModelExtensionCommand command = null; for( Provides provide : this.ise.getJbiModel().getServices().getProvides()) { command = new InitializeModelExtensionCommand( extensionPackage, provide ); if( command.prepare()) initializeCommand.append( command ); } for( Consumes consume : this.ise.getJbiModel().getServices().getConsumes()) { command = new InitializeModelExtensionCommand( extensionPackage, consume ); if( command.prepare()) initializeCommand.append( command ); } } getEditingDomain().getCommandStack().execute( initializeCommand ); ((BasicCommandStack) getEditingDomain().getCommandStack()).saveIsDone(); } /** * Initializes the widgets on the left side. */ protected void createLeftWidgets() { Composite servicesComposite = getFormToolkit().createComposite( this ); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; servicesComposite.setLayout( layout ); // Provides Form providesForm = getFormToolkit().createForm( servicesComposite ); providesForm.setLayoutData( new GridData( GridData.FILL_BOTH )); providesForm.setText( Messages.provides ); layout = new GridLayout(2, false ); layout.marginHeight = 0; providesForm.getBody().setLayout( layout ); this.providesViewer = new TableViewer( providesForm.getBody()); this.providesViewer.getControl().setLayoutData( new GridData(GridData.FILL_BOTH)); this.providesViewer.setLabelProvider( this.labelProvider ); this.providesViewer.setContentProvider( new ArrayContentProvider()); Composite providesButtons = getFormToolkit().createComposite( providesForm.getBody()); layout = new GridLayout(); layout.marginHeight = 0; providesButtons.setLayout( layout ); providesButtons.setLayoutData( new GridData( SWT.DEFAULT, SWT.TOP, false, true )); Button newProvidesButton = getFormToolkit().createButton(providesButtons, "New...", SWT.NONE); newProvidesButton.setLayoutData( new GridData( SWT.FILL, SWT.TOP, false, true, 1, 1 )); newProvidesButton.setImage( PetalsImages.INSTANCE.getAdd()); final IWizard providesWizard = findNewWizard( PetalsMode.provides ); if( providesWizard == null ) { newProvidesButton.setEnabled( false ); newProvidesButton.setToolTipText( "The component is not supported." ); } else { newProvidesButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { if( new WizardDialog( getShell(), providesWizard ).open() == Dialog.OK ) SuEditionComposite.this.providesViewer.refresh(); } }); } final Button removeProvidesButton = getFormToolkit().createButton( providesButtons, "Remove", SWT.NONE ); removeProvidesButton.setLayoutData( new GridData( SWT.FILL, SWT.TOP, false, false, 1, 1 )); removeProvidesButton.setImage( PetalsImages.INSTANCE.getDelete()); removeProvidesButton.addSelectionListener( new EListRemoveSelectionListener( this.providesViewer )); final Button upProvidesButton = getFormToolkit().createButton(providesButtons, "", SWT.NONE); upProvidesButton.setLayoutData( new GridData( SWT.FILL, SWT.TOP, false, false, 1, 1 )); upProvidesButton.setText( "&Up" ); upProvidesButton.addSelectionListener( new EListUpSelectionListener()); final Button downProvidesButton = getFormToolkit().createButton(providesButtons, "", SWT.NONE); downProvidesButton.setLayoutData( new GridData( SWT.FILL, SWT.TOP, false, false, 1, 1 )); downProvidesButton.setText( "&Down" ); downProvidesButton.addSelectionListener( new EListDownSelectionListener()); getDataBindingContext().bindValue( ViewersObservables.observeInput( this.providesViewer ), EMFEditObservables.observeValue( getEditingDomain(), getJbiModel().getServices(), JbiPackage.Literals.SERVICES__PROVIDES )); // Consumes Form consumesForm = getFormToolkit().createForm( servicesComposite ); consumesForm.setLayoutData( new GridData( GridData.FILL_BOTH )); consumesForm.setText( Messages.consumes ); layout = new GridLayout(2, false ); layout.marginHeight = 0; consumesForm.getBody().setLayout( layout ); this.consumesViewer = new TableViewer( consumesForm.getBody()); this.consumesViewer.getControl().setLayoutData( new GridData( GridData.FILL_BOTH )); this.consumesViewer.setLabelProvider( this.labelProvider ); this.consumesViewer.setContentProvider( new ArrayContentProvider()); Composite consumesButtons = getFormToolkit().createComposite( consumesForm.getBody()); layout = new GridLayout(); layout.marginHeight = 0; consumesButtons.setLayout( layout ); consumesButtons.setLayoutData( new GridData( SWT.DEFAULT, SWT.TOP, false, true )); Button newConsumesButton = getFormToolkit().createButton( consumesButtons, "New...", SWT.NONE ); newConsumesButton.setLayoutData( new GridData( SWT.FILL, SWT.TOP, false, false, 1, 1 )); newConsumesButton.setImage( PetalsImages.INSTANCE.getAdd()); final IWizard consumesWizard = findNewWizard( PetalsMode.consumes ); if( consumesWizard == null ) { newConsumesButton.setEnabled( false ); newConsumesButton.setToolTipText( "The component is not supported." ); } else { newConsumesButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { if( new WizardDialog( getShell(), consumesWizard ).open() == Dialog.OK ) SuEditionComposite.this.consumesViewer.refresh(); } }); } final Button removeConsumesButton = getFormToolkit().createButton( consumesButtons, "Remove", SWT.NONE ); removeConsumesButton.setLayoutData( new GridData( SWT.FILL, SWT.TOP, false, false, 1, 1 )); removeConsumesButton.setImage( PetalsImages.INSTANCE.getDelete()); removeConsumesButton.addSelectionListener( new EListRemoveSelectionListener(this.consumesViewer)); final Button upConsumesButton = getFormToolkit().createButton( consumesButtons, "", SWT.NONE ); upConsumesButton.setLayoutData( new GridData( SWT.FILL, SWT.TOP, false, false, 1, 1 )); upConsumesButton.setText( "&Up" ); upConsumesButton.addSelectionListener( new EListUpSelectionListener()); final Button downConsumesButton = getFormToolkit().createButton( consumesButtons, "", SWT.NONE ); downConsumesButton.setLayoutData( new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1 )); downConsumesButton.setText( "&Down" ); downConsumesButton.addSelectionListener( new EListDownSelectionListener()); getDataBindingContext().bindValue( ViewersObservables.observeInput( this.consumesViewer ), EMFEditObservables.observeValue( getEditingDomain(), getJbiModel().getServices(), JbiPackage.Literals.SERVICES__CONSUMES )); this.providesViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = ((IStructuredSelection) SuEditionComposite.this.providesViewer.getSelection()); if (selection.isEmpty()) { SuEditionComposite.this.selectedEndpoint = null; upProvidesButton.setEnabled(false); downProvidesButton.setEnabled(false); } else { SuEditionComposite.this.consumesViewer.setSelection(new StructuredSelection()); SuEditionComposite.this.selectedEndpoint = (Provides) selection.getFirstElement(); SuEditionComposite.this.containmentList = getJbiModel().getServices().getProvides(); upProvidesButton.setEnabled(SuEditionComposite.this.containmentList.indexOf(SuEditionComposite.this.selectedEndpoint) > 0); downProvidesButton.setEnabled( SuEditionComposite.this.containmentList.indexOf(SuEditionComposite.this.selectedEndpoint) != SuEditionComposite.this.containmentList.size() - 1); refreshDetails(); } removeProvidesButton.setEnabled(SuEditionComposite.this.selectedEndpoint != null); } }); this.consumesViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = ((IStructuredSelection) SuEditionComposite.this.consumesViewer.getSelection()); if (selection.isEmpty()) { SuEditionComposite.this.selectedEndpoint = null; upConsumesButton.setEnabled(false); downConsumesButton.setEnabled(false); } else { SuEditionComposite.this.providesViewer.setSelection(new StructuredSelection()); SuEditionComposite.this.selectedEndpoint = (Consumes)selection.getFirstElement(); SuEditionComposite.this.containmentList = getJbiModel().getServices().getConsumes(); upConsumesButton.setEnabled(SuEditionComposite.this.containmentList.indexOf(SuEditionComposite.this.selectedEndpoint) > 0); downConsumesButton.setEnabled(SuEditionComposite.this.containmentList.indexOf( SuEditionComposite.this.selectedEndpoint) != SuEditionComposite.this.containmentList.size() - 1); refreshDetails(); } removeConsumesButton.setEnabled(SuEditionComposite.this.selectedEndpoint != null); } }); } /** * Initializes the widgets on the right side. */ protected void createRightWidgets() { Composite container = getFormToolkit().createComposite( this ); GridLayoutFactory.swtDefaults().margins( 10, 0 ).extendedMargins( 0, 0, 20, 0 ).applyTo( container ); container.setLayoutData( new GridData( GridData.FILL_BOTH )); final ScrolledPageBook pageBook = new ScrolledPageBook( container ); pageBook.setLayoutData( new GridData( GridData.FILL_BOTH )); getFormToolkit().adapt( pageBook ); // Tabs Composite[] controls = new Composite[ 3 ]; this.mainDetails = createScrollable( pageBook.getContainer(), controls, 0 ); this.advancedDetails = createScrollable( pageBook.getContainer(), controls, 1 ); Composite sourceContainer = getFormToolkit().createComposite( pageBook.getContainer(), SWT.NONE ); controls[ 2 ] = sourceContainer; GridLayoutFactory.swtDefaults().extendedMargins( 5, 5, 7, 0 ).spacing( 0, 14 ).applyTo( sourceContainer ); createSourceTabContent( sourceContainer ); // Add the labels Composite labelContainer = getFormToolkit().createComposite( container ); GridLayoutFactory.swtDefaults().numColumns( 3 ).margins( 5, 0 ).extendedMargins( 5, 0, 0, 0 ).spacing( 8, 0 ).applyTo( labelContainer ); String[] labels = { "Main", "Advanced", "Source" }; final List<Label> navigationLabels = new ArrayList<Label> (); Listener mouseDownListener = new Listener() { @Override public void handleEvent( Event event ) { pageBook.showPage( event.widget.getData()); // Highlight the selected tab for( Label l : navigationLabels ) { Color color; if( l != event.widget && l.getParent() != event.widget ) color = Display.getDefault().getSystemColor( SWT.COLOR_WIDGET_BACKGROUND ); else color = Display.getDefault().getSystemColor( SWT.COLOR_WHITE ); l.setBackground( color ); l.getParent().setBackground( color ); } } }; // Register the pages and bind it all int i=0; for( String label : labels ) { Label l = createTabLabel( i, label, labelContainer, mouseDownListener ); navigationLabels.add( l ); pageBook.registerPage( i, controls[ i ]); i ++; } // Force to display the first tab (and force it to be highlighted) navigationLabels.get( 0 ).notifyListeners( SWT.MouseDown, new Event()); } /** * Creates a label for the tab (wrapped in a composite for better display). * @param index the tab index * @param parent the container for the label * @param mouseDownListener the listener for when a tab is selected * @return the created label */ private Label createTabLabel( int index, String title, Composite parent, Listener mouseDownListener ) { // Wrap the labels in a composite Composite c = getFormToolkit().createComposite( parent, SWT.BORDER ); c.setLayout( new GridLayout()); c.setLayoutData( new GridData( 90, 25 )); c.setData( index ); // Deal with the content Label l = getFormToolkit().createLabel( c, title ); l.setLayoutData( new GridData( SWT.CENTER, SWT.CENTER, true, true )); l.setData( index ); // The click listener l.addListener( SWT.MouseDown, mouseDownListener ); c.addListener( SWT.MouseDown, mouseDownListener ); return l; } /** * Creates a scrollable that can be displayed in a scrolled page book. * @param parent * @param controls the controls that will associated with a page * @param index the index of the controls (page order, 0-based index) * @return the composite in which children can be added */ private Composite createScrollable( Composite parent, Control[] controls, int index ) { Composite container = getFormToolkit().createComposite( parent ); controls[ index ] = container; GridLayoutFactory.swtDefaults().margins( 0, 0 ).extendedMargins( 0, 0, 7, 0 ).applyTo( container ); container.setLayoutData( new GridData( GridData.FILL_BOTH )); // Since we are going to put sections in it, we cannot use a scrolled composite. // Section#reflow searches for a SharedScrolledComposite instance. // Using a scrolled composite will result in updating the entire editor and having a too big width. // The solution is to use an instance of SharedScrolledComposite as a parent => ScrolledForm. ScrolledForm scrolledForm = getFormToolkit().createScrolledForm( container ); scrolledForm.setLayoutData( new GridData( GridData.FILL_BOTH )); Composite result = scrolledForm.getBody(); result.setLayout( new GridLayout()); result.setLayoutData( new GridData( GridData.FILL_BOTH )); return result; } /** * @param container */ private void createSourceTabContent( Composite container ) { // Create an explanation text StringBuilder sb = new StringBuilder(); sb.append( "<form>" ); sb.append( "<p>This is just an overview. To edit the sources, please, use the <a>Petals Source Editor</a>.</p>" ); sb.append( "</form>" ); FormText formText = this.ise.getFormToolkit().createFormText( container, false ); formText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); formText.setText( sb.toString(), true, false ); formText.addHyperlinkListener( new OpenSourceEditorHyperlinkListener( this.ise.getEditedFile(), false )); // Show the source final StyledText sourceViewerText = SwtFactory.createXmlTextViewer( container, false ); sourceViewerText.setEditable( false ); sourceViewerText.getParent().setLayoutData( new GridData( GridData.FILL_BOTH )); sourceViewerText.setToolTipText( "Sources cannot be edited directly in this editor" ); ISelectionChangedListener listener = new ISelectionChangedListener() { @Override public void selectionChanged( SelectionChangedEvent event ) { if( event.getSelection().isEmpty()) return; Object o = ((IStructuredSelection) event.getSelection()).getFirstElement(); if( o instanceof AbstractEndpoint ) refreshSourceViewer( sourceViewerText, (AbstractEndpoint) o, null ); } }; this.providesViewer.addSelectionChangedListener( listener ); this.consumesViewer.addSelectionChangedListener( listener ); // Refresh the viewer when the model changes final AtomicBoolean lock = new AtomicBoolean( false ); // We use a lock because writing the model as a string results in resource change => infinite loop. // Notification filters are not of great help here. ((TransactionalEditingDomain) getEditingDomain()).addResourceSetListener( new ResourceSetListenerImpl() { @Override public boolean isPostcommitOnly() { return true; } @Override public void resourceSetChanged( ResourceSetChangeEvent event ) { if( ! lock.get()) refreshSourceViewer( sourceViewerText, SuEditionComposite.this.selectedEndpoint, lock ); else lock.set( false ); } }); } /** * Refreshes the source viewer. * @param sourceText * @param endpoint * @param lock */ private void refreshSourceViewer( final StyledText sourceText, final AbstractEndpoint endpoint, AtomicBoolean lock ) { // Lock here. It will be released above. if( lock != null ) lock.set( true ); // Write the partial document in an EMF command (transaction) final StringBuilder sb = new StringBuilder(); if( endpoint == null ) { sb.append( "<!-- Nothing to serialize -->" ); } else { Document doc = JbiXmlUtils.savePartialJbiXmlAsDocument( endpoint ); if( doc == null ) { sb.append( "<!-- \nThe selection could be serialized.\nAn error occured.\nCheck the logs for more details.\n -->" ); } else { SuPersonality.sortNodes( doc, false ); sb.append( DomUtils.writeDocument( doc, true )); } } // Update the UI then Display.getDefault().asyncExec( new Runnable() { @Override public void run() { if( ! sourceText.isDisposed()) sourceText.setText( sb.toString()); } }); } /** * @param toolkit * @param generalDetails */ private void re_fillMainDetailsContainer(FormToolkit toolkit, Composite generalDetails) { for (Control control : generalDetails.getChildren()) control.dispose(); if (this.componentContributions != null) { GridLayoutFactory.swtDefaults().spacing( 0, 20 ).applyTo( generalDetails ); this.componentContributions.addMainSUContent(this.selectedEndpoint, toolkit, generalDetails, this ); } generalDetails.layout(true); } /** * @param toolkit * @param advancedDetails */ private void re_fillAdvancedDetailsContainer(FormToolkit toolkit, Composite advancedDetails) { for (Control control : advancedDetails.getChildren()) control.dispose(); if (this.componentContributions != null) { GridLayoutFactory.swtDefaults().spacing( 0, 20 ).applyTo( advancedDetails ); this.componentContributions.addAdvancedSUContent(this.selectedEndpoint, toolkit, advancedDetails, this ); } advancedDetails.layout(true); } /** * Refreshes the right part. */ private void refreshDetails() { this.componentContributions = null; if( this.selectedEndpoint != null ) { Properties projectProperties = PetalsSPPropertiesManager.getProperties( getEditedFile().getProject()); String suTypeVersion = projectProperties.getProperty( PetalsSPPropertiesManager.COMPONENT_VERSION, "" ); String componentName = projectProperties.getProperty( PetalsSPPropertiesManager.COMPONENT_NAME, "" ); // first let's try with the project configuration ComponentVersionDescription componentDesc = ExtensionManager.INSTANCE.findDescriptionByComponentNameAndVersion( componentName, suTypeVersion ); if (componentDesc == null) { // if none is found (or if there is no project configuration file or no correct data in it) // let's rely on the namespaces componentDesc = ExtensionManager.INSTANCE.findComponentDescription( this.selectedEndpoint ); } if( componentDesc != null ) { EditorContributionSupport support = componentDesc.createNewExtensionSupport(); if( support != null ) this.componentContributions = support.createJbiEditorContribution( this.selectedEndpoint ); else this.componentContributions = new DefaultJbiEditorContribution(); } else { this.componentContributions = new DefaultJbiEditorContribution(); } } re_fillMainDetailsContainer( this.ise.getFormToolkit(), this.mainDetails ); re_fillAdvancedDetailsContainer( this.ise.getFormToolkit(), this.advancedDetails ); } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.editor.ISharedEdition * #getEditingDomain() */ @Override public EditingDomain getEditingDomain() { return this.ise.getEditingDomain(); } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.editor.ISharedEdition * #getEditedFile() */ @Override public IFile getEditedFile() { return this.ise.getEditedFile(); } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.editor.ISharedEdition * #getDataBindingContext() */ @Override public DataBindingContext getDataBindingContext() { return this.ise.getDataBindingContext(); } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.editor.ISharedEdition * #getJbiModel() */ @Override public Jbi getJbiModel() { return this.ise.getJbiModel(); } /* * (non-Javadoc) * @see com.ebmwebsourcing.petals.services.su.editor.ISharedEdition * #getFormToolkit() */ @Override public FormToolkit getFormToolkit() { return this.ise.getFormToolkit(); } /** * Finds the right SU wizard depending on the project's configuration. * @param petalsMode provides or consumes * @return a wizard, or null if nothing matches the project's configuration */ private IWizard findNewWizard( PetalsMode petalsMode ) { // Find the component name and version Properties props = PetalsSPPropertiesManager.getProperties( this.ise.getEditedFile().getProject()); String componentName = props.getProperty( PetalsSPPropertiesManager.COMPONENT_NAME ); String componentVersion = props.getProperty( PetalsSPPropertiesManager.COMPONENT_VERSION ); if( StringUtils.isEmpty( componentVersion ) || StringUtils.isEmpty( componentName )) return null; // Look for the right wizard IWizard result = null; for( AbstractServiceUnitWizard handler : ExtensionManager.INSTANCE.findComponentWizards( petalsMode )) { if( ! componentName.equals( handler.getComponentVersionDescription().getComponentName())) continue; if( ! componentVersion.equals( handler.getComponentVersionDescription().getComponentVersion())) continue; FinishServiceCreationStrategy strategy = petalsMode == PetalsMode.provides ? new AddProvidesToExistingJbiStrategy( getJbiModel(), getEditingDomain(), getEditedFile().getProject()) : new AddConsumesToExistingJbiStrategy( getJbiModel(), getEditingDomain(), getEditedFile().getProject()); handler.setStrategy( strategy ); result = handler; break; } return result; } /** * A selection to remove an element from a viewer. * @author Mickael Istria - EBM WebSourcing */ private final class EListRemoveSelectionListener extends DefaultSelectionListener { private final Viewer servicesViewer; /** * Constructor. * @param servicesViewer */ private EListRemoveSelectionListener( Viewer servicesViewer ) { this.servicesViewer = servicesViewer; } /* * (non-Javadoc) * @see org.eclipse.swt.events.SelectionAdapter * #widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { if( MessageDialog.openConfirm( getShell(), Messages.confimeRemoveEndpointTitle, Messages.confimeRemoveEndpointMessage )) { RemoveCommand deleteCommand = new RemoveCommand( getEditingDomain(), SuEditionComposite.this.containmentList, SuEditionComposite.this.selectedEndpoint); getEditingDomain().getCommandStack().execute( deleteCommand ); this.servicesViewer.refresh(); } } } /** * A selection to move an element downward in a viewer. * @author Mickael Istria - EBM WebSourcing */ private final class EListDownSelectionListener extends DefaultSelectionListener { /* * (non-Javadoc) * @see org.eclipse.swt.events.SelectionAdapter * #widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { MoveCommand moveCommand = new MoveCommand( getEditingDomain(), SuEditionComposite.this.containmentList, SuEditionComposite.this.selectedEndpoint, SuEditionComposite.this.containmentList.indexOf( SuEditionComposite.this.selectedEndpoint ) + 1 ); getEditingDomain().getCommandStack().execute( moveCommand ); } } /** * A selection to move an element upward in a viewer. * @author Mickael Istria - EBM WebSourcing */ private final class EListUpSelectionListener extends DefaultSelectionListener { /* * (non-Javadoc) * @see org.eclipse.swt.events.SelectionListener * #widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { MoveCommand moveCommand = new MoveCommand( getEditingDomain(), SuEditionComposite.this.containmentList, SuEditionComposite.this.selectedEndpoint, SuEditionComposite.this.containmentList.indexOf( SuEditionComposite.this.selectedEndpoint ) - 1 ); getEditingDomain().getCommandStack().execute( moveCommand ); } } }