/****************************************************************************** * 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.sa.editor; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Properties; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; 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.EObject; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.emf.edit.command.MoveCommand; import org.eclipse.emf.edit.command.RemoveCommand; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.dialogs.MessageDialog; 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.TreeViewer; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.dialogs.ListSelectionDialog; import org.eclipse.ui.forms.widgets.ExpandableComposite; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledPageBook; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.TableWrapData; import org.eclipse.ui.model.WorkbenchLabelProvider; import com.ebmwebsourcing.petals.common.internal.provisional.formeditor.ISharedEdition; import com.ebmwebsourcing.petals.common.internal.provisional.misc.IProjectComparator; import com.ebmwebsourcing.petals.common.internal.provisional.swt.DefaultSelectionListener; import com.ebmwebsourcing.petals.common.internal.provisional.swt.DefaultTreeContentProvider; 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.editor.ServicesLabelProvider; import com.ebmwebsourcing.petals.services.su.jbiproperties.PetalsSPPropertiesManager; import com.ebmwebsourcing.petals.services.utils.ServiceProjectRelationUtils; import com.sun.java.xml.ns.jbi.Identification; import com.sun.java.xml.ns.jbi.JbiFactory; import com.sun.java.xml.ns.jbi.JbiPackage; import com.sun.java.xml.ns.jbi.ServiceAssembly; import com.sun.java.xml.ns.jbi.ServiceUnit; import com.sun.java.xml.ns.jbi.Target; /** * The composite to display in the JBI form editor for service assemblies. * @author Vincent Zurczak - EBM WebSourcing */ public class SaEditionComposite extends SashForm { private final ISharedEdition ise; private EObject viewerSelection; private final Color blueFont; private TreeViewer viewer; private LabelProvider labelProvider; private ScrolledPageBook pageBook; private Text saNameText, saDescText, suNameText, suDescText, suArtifactsText, suComponentText; /** * Constructor. * @param parent */ public SaEditionComposite( Composite parent, ISharedEdition ise ) { super( parent, SWT.NONE ); this.ise = ise; this.blueFont = getDisplay().getSystemColor( SWT.COLOR_DARK_BLUE ); setLayoutData ( new GridData( GridData.FILL_BOTH )); ise.getFormToolkit().adapt( this ); ise.getFormToolkit().paintBordersFor( this ); createLeftWidgets(); createRightWidgets(); setWeights( new int[]{ 1, 1 }); this.viewer.getTree().setFocus(); this.viewer.setSelection( new StructuredSelection( ise.getJbiModel().getServiceAssembly())); this.viewer.getTree().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(); if( this.blueFont != null && ! this.blueFont.isDisposed()) this.blueFont.dispose(); super.dispose(); } /** * Initializes the widgets on the left side. */ protected void createLeftWidgets() { FormToolkit toolkit = this.ise.getFormToolkit(); Composite container = toolkit.createComposite( this ); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginTop = 11; layout.marginRight = 7; container.setLayout( layout ); container.setLayoutData( new GridData( GridData.FILL_BOTH )); Section section = toolkit.createSection( container, Section.DESCRIPTION | ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED ); section.setLayoutData( new GridData( GridData.FILL_BOTH )); section.clientVerticalSpacing = 10; section.setText( "Service Assembly's Content" ); section.setDescription( "Select the elements to edit." ); container = toolkit.createComposite( section ); layout = new GridLayout( 2, false ); layout.marginWidth = 0; container.setLayout( layout ); container.setLayoutData( new TableWrapData( TableWrapData.FILL_GRAB )); section.setClient( container ); // Add the tree Tree tree = toolkit.createTree( container, SWT.BORDER | SWT.MULTI ); this.viewer = new TreeViewer( tree ); this.viewer.getTree().setLayoutData( new GridData( GridData.FILL_BOTH )); // Add the content provider this.labelProvider = new ServicesLabelProvider(); this.viewer.setLabelProvider( this.labelProvider ); this.viewer.setContentProvider( new DefaultTreeContentProvider() { @Override public Object[] getElements( Object inputElement ) { Object o = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly(); return new Object[] { o }; } @Override public boolean hasChildren( Object element ) { return getChildren( element ).length > 0; } @Override public Object getParent( Object element ) { return null; } @Override public Object[] getChildren( Object parentElement ) { Object[] result = new Object[ 0 ]; if( parentElement instanceof ServiceAssembly ) result = ((ServiceAssembly) parentElement).getServiceUnit().toArray(); return result; } }); this.viewer.setInput( new Object()); this.viewer.expandAll(); // Add the buttons Composite buttonsComposite = toolkit.createComposite( container ); layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; buttonsComposite.setLayout( layout ); buttonsComposite.setLayoutData( new GridData( SWT.DEFAULT, SWT.TOP, false, false )); Button newSuButton = this.ise.getFormToolkit().createButton( buttonsComposite, "New...", SWT.PUSH ); newSuButton.setLayoutData( new GridData( SWT.FILL, SWT.TOP, false, false )); newSuButton.setImage( PetalsImages.INSTANCE.getAdd()); newSuButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { // Select a SU project List<IProject> suProjects = ServiceProjectRelationUtils.getAllSuProjects(); Collections.sort( suProjects, new IProjectComparator()); // Filter projects List<IProject> alreadyPresent = new ArrayList<IProject> (); IWorkspaceRoot iwr = ResourcesPlugin.getWorkspace().getRoot(); for( ServiceUnit su : SaEditionComposite.this.ise.getJbiModel().getServiceAssembly().getServiceUnit()) { if( su.getIdentification() == null ) continue; if( StringUtils.isEmpty( su.getIdentification().getName())) continue; IProject p = iwr.getProject( su.getIdentification().getName()); if( p.exists()) alreadyPresent.add( p ); } suProjects.removeAll( alreadyPresent ); // Open the selection dialog ListSelectionDialog dlg = new ListSelectionDialog( getShell(), suProjects, new ArrayContentProvider(), new WorkbenchLabelProvider(), "Select a Service Unit project." ); dlg.setTitle( "Service Unit Selection" ); if( dlg.open() != Window.OK ) return; // Create the SU element CompoundCommand cc = new CompoundCommand(); for( Object o : dlg.getResult()) { IProject suProject = (IProject) o; ServiceUnit su = JbiFactory.eINSTANCE.createServiceUnit(); Identification id = JbiFactory.eINSTANCE.createIdentification(); id.setName( suProject.getName()); id.setDescription( "" ); su.setIdentification( id ); Target target = JbiFactory.eINSTANCE.createTarget(); target.setArtifactsZip( suProject.getName() + ".zip" ); Properties properties = PetalsSPPropertiesManager.getProperties( suProject ); String componentName = properties.getProperty( PetalsSPPropertiesManager.COMPONENT_DEPLOYMENT_ID, "" ); target.setComponentName( componentName ); su.setTarget( target ); EList<?> list = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly().getServiceUnit(); AddCommand addCommand = new AddCommand( SaEditionComposite.this.ise.getEditingDomain(), list, su ); cc.append( addCommand ); } // Execute the command SaEditionComposite.this.ise.getEditingDomain().getCommandStack().execute( cc ); // Update the viewers SaEditionComposite.this.viewer.refresh(); SaEditionComposite.this.viewer.expandAll(); SaEditionComposite.this.viewer.setSelection( new StructuredSelection( SaEditionComposite.this.ise.getJbiModel().getServiceAssembly())); SaEditionComposite.this.viewer.getTree().notifyListeners( SWT.Selection, new Event()); SaEditionComposite.this.viewer.getTree().setFocus(); } }); final Button removeProvidesButton = this.ise.getFormToolkit().createButton( buttonsComposite, "Remove", SWT.PUSH ); removeProvidesButton.setLayoutData( new GridData( SWT.FILL, SWT.TOP, false, false )); removeProvidesButton.setImage( PetalsImages.INSTANCE.getDelete()); removeProvidesButton.addSelectionListener( new DefaultSelectionListener() { /* * (non-Javadoc) * @see org.eclipse.swt.events.SelectionListener * #widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { if( MessageDialog.openConfirm( getShell(), Messages.confimeRemoveEndpointTitle, Messages.confimeRemoveEndpointMessage )) { ServiceAssembly sa = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly(); Object o = ((IStructuredSelection) SaEditionComposite.this.viewer.getSelection()).getFirstElement(); RemoveCommand deleteCommand = new RemoveCommand( SaEditionComposite.this.ise.getEditingDomain(), sa.getServiceUnit(), o ); SaEditionComposite.this.ise.getEditingDomain().getCommandStack().execute( deleteCommand ); SaEditionComposite.this.pageBook.removePage( o ); SaEditionComposite.this.viewer.refresh(); SaEditionComposite.this.viewer.expandAll(); SaEditionComposite.this.viewer.setSelection( new StructuredSelection( sa )); SaEditionComposite.this.viewer.getTree().notifyListeners( SWT.Selection, new Event()); } } }); final Button upProvidesButton = this.ise.getFormToolkit().createButton( buttonsComposite, "", SWT.PUSH ); upProvidesButton.setLayoutData( new GridData( SWT.FILL, SWT.TOP, false, false )); upProvidesButton.setText( "&Up" ); upProvidesButton.addSelectionListener( new DefaultSelectionListener() { /* * (non-Javadoc) * @see org.eclipse.swt.events.SelectionListener * #widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { EList<?> list = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly().getServiceUnit(); Object o = ((IStructuredSelection) SaEditionComposite.this.viewer.getSelection()).getFirstElement(); MoveCommand moveCommand = new MoveCommand( SaEditionComposite.this.ise.getEditingDomain(), list, o, list.indexOf(o ) - 1 ); SaEditionComposite.this.ise.getEditingDomain().getCommandStack().execute( moveCommand ); } }); final Button downProvidesButton = this.ise.getFormToolkit().createButton( buttonsComposite, "", SWT.PUSH ); downProvidesButton.setLayoutData( new GridData( SWT.FILL, SWT.TOP, false, false )); downProvidesButton.setText( "&Down" ); downProvidesButton.addSelectionListener( new DefaultSelectionListener() { /* * (non-Javadoc) * @see org.eclipse.swt.events.SelectionListener * #widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected( SelectionEvent e ) { EList<?> list = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly().getServiceUnit(); Object o = ((IStructuredSelection) SaEditionComposite.this.viewer.getSelection()).getFirstElement(); MoveCommand moveCommand = new MoveCommand( SaEditionComposite.this.ise.getEditingDomain(), list, o, list.indexOf(o ) + 1 ); SaEditionComposite.this.ise.getEditingDomain().getCommandStack().execute( moveCommand ); } }); this.viewer.addSelectionChangedListener( new ISelectionChangedListener() { @Override public void selectionChanged( SelectionChangedEvent event ) { Object o = ((IStructuredSelection) SaEditionComposite.this.viewer.getSelection()).getFirstElement(); EList<?> sus = SaEditionComposite.this.ise.getJbiModel().getServiceAssembly().getServiceUnit(); boolean isSa = o instanceof ServiceAssembly; boolean isFirst = sus.indexOf( o ) == 0; boolean isLast = sus.indexOf( o ) == sus.size() - 1; downProvidesButton.setEnabled( ! isSa && ! isLast ); upProvidesButton.setEnabled( ! isSa && ! isFirst ); removeProvidesButton.setEnabled( ! isSa ); } }); } /** * Initializes the widgets on the right side. */ protected void createRightWidgets() { this.pageBook = new ScrolledPageBook( this ); this.pageBook.setLayoutData( new GridData( GridData.FILL_BOTH )); this.viewer.addSelectionChangedListener( new ISelectionChangedListener() { @Override public void selectionChanged( SelectionChangedEvent event ) { if( SaEditionComposite.this.viewer.getSelection().isEmpty()) return; Object o = ((IStructuredSelection) SaEditionComposite.this.viewer.getSelection()).getFirstElement(); SaEditionComposite.this.viewerSelection = (EObject) o; if( ! SaEditionComposite.this.pageBook.hasPage( o )) { Composite parent = SaEditionComposite.this.pageBook.getContainer(); if( o instanceof ServiceAssembly ) SaEditionComposite.this.pageBook.registerPage( o, createSaSection( parent )); else if( o instanceof ServiceUnit ) SaEditionComposite.this.pageBook.registerPage( o, createSuSection( parent )); else SaEditionComposite.this.pageBook.showEmptyPage(); } SaEditionComposite.this.pageBook.showPage( o ); } }); } /** * Creates the section for the properties of a service assembly. * @param parent the parent * @return a new section */ private Composite createSaSection( Composite parent ) { // Container FormToolkit toolkit = this.ise.getFormToolkit(); Composite container = toolkit.createComposite( parent ); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginTop = 11; layout.marginLeft = 3; container.setLayout( layout ); container.setLayoutData( new GridData( GridData.FILL_BOTH )); Section section = toolkit.createSection( container, Section.DESCRIPTION | ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED ); section.setLayoutData( new GridData( GridData.FILL_BOTH )); section.clientVerticalSpacing = 10; section.setText( "Service Assembly's Properties" ); section.setDescription( "Edit the properties of the selected service assembly." ); container = toolkit.createComposite( section, SWT.NONE ); layout = new GridLayout( 2, false ); layout.marginHeight = 0; layout.marginWidth = 0; layout.horizontalSpacing = 10; container.setLayout( layout ); container.setLayoutData( new TableWrapData( TableWrapData.FILL_GRAB )); section.setClient( container ); // Texts final ServiceAssembly sa = (ServiceAssembly) this.viewerSelection; Label label = SwtFactory.createLabel( container, "Name:", "The name of the service assembly" ); label.setForeground( this.blueFont ); this.saNameText = toolkit.createText( container, "", SWT.SINGLE | SWT.BORDER ); this.saNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); this.saNameText.addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { SaEditionComposite.this.viewer.refresh( sa, true ); } }); this.ise.getDataBindingContext().bindValue( SWTObservables.observeText( this.saNameText ), EMFEditObservables.observeValue( this.ise.getEditingDomain(), sa.getIdentification(), JbiPackage.Literals.IDENTIFICATION__NAME )); label = SwtFactory.createLabel( container, "Description:", "The description of the service assembly" ); label.setForeground( this.blueFont ); label.setLayoutData( new GridData( SWT.DEFAULT, SWT.TOP, false, false )); this.saDescText = toolkit.createText( container, "", SWT.MULTI | SWT.BORDER ); GridData layoutData = new GridData( SWT.FILL, SWT.BEGINNING, true, false ); layoutData.heightHint = 60; this.saDescText.setLayoutData( layoutData ); this.ise.getDataBindingContext().bindValue( SWTObservables.observeText( this.saDescText ), EMFEditObservables.observeValue( this.ise.getEditingDomain(), sa.getIdentification(), JbiPackage.Literals.IDENTIFICATION__DESCRIPTION )); return section.getParent(); } /** * Creates the section for the properties of a service unit. * @param parent the parent * @return a new section */ private Composite createSuSection( Composite parent ) { // Container FormToolkit toolkit = this.ise.getFormToolkit(); Composite container = toolkit.createComposite( parent ); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginTop = 11; layout.marginLeft = 3; container.setLayout( layout ); container.setLayoutData( new GridData( GridData.FILL_BOTH )); Section section = toolkit.createSection( container, Section.DESCRIPTION | ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED ); section.setLayoutData( new GridData( GridData.FILL_BOTH )); section.clientVerticalSpacing = 10; section.setText( "Service Unit's Properties" ); section.setDescription( "Edit the properties of the selected service unit." ); container = toolkit.createComposite( section, SWT.NONE ); layout = new GridLayout( 2, false ); layout.marginHeight = 0; layout.marginWidth = 0; layout.horizontalSpacing = 10; container.setLayout( layout ); container.setLayoutData( new TableWrapData( TableWrapData.FILL_GRAB )); section.setClient( container ); // Texts final ServiceUnit su = (ServiceUnit) this.viewerSelection; Label label = SwtFactory.createLabel( container, "Name:", "The name of the service assembly" ); label.setForeground( this.blueFont ); this.suNameText = toolkit.createText( container, "", SWT.SINGLE | SWT.BORDER ); this.suNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); this.suNameText.addModifyListener( new ModifyListener() { @Override public void modifyText( ModifyEvent e ) { SaEditionComposite.this.viewer.refresh( su, true ); } }); this.ise.getDataBindingContext().bindValue( SWTObservables.observeText( this.suNameText ), EMFEditObservables.observeValue( this.ise.getEditingDomain(), su.getIdentification(), JbiPackage.Literals.IDENTIFICATION__NAME )); label = SwtFactory.createLabel( container, "Description:", "The description of the service assembly" ); label.setForeground( this.blueFont ); label.setLayoutData( new GridData( SWT.DEFAULT, SWT.TOP, false, false )); this.suDescText = toolkit.createText( container, "", SWT.MULTI | SWT.BORDER ); GridData layoutData = new GridData( SWT.FILL, SWT.BEGINNING, true, false ); layoutData.heightHint = 60; this.suDescText.setLayoutData( layoutData ); this.ise.getDataBindingContext().bindValue( SWTObservables.observeText( this.suDescText ), EMFEditObservables.observeValue( this.ise.getEditingDomain(), su.getIdentification(), JbiPackage.Literals.IDENTIFICATION__DESCRIPTION )); label = SwtFactory.createLabel( container, "Zip Artifact:", "The name of the *.zip artifact" ); label.setForeground( this.blueFont ); this.suArtifactsText = toolkit.createText( container, "", SWT.SINGLE | SWT.BORDER ); this.suArtifactsText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); this.ise.getDataBindingContext().bindValue( SWTObservables.observeText( this.suArtifactsText ), EMFEditObservables.observeValue( this.ise.getEditingDomain(), su.getTarget(), JbiPackage.Literals.TARGET__ARTIFACTS_ZIP )); label = SwtFactory.createLabel( container, "Component name:", "The name of the target component" ); label.setForeground( this.blueFont ); this.suComponentText = toolkit.createText( container, "", SWT.SINGLE | SWT.BORDER ); this.suComponentText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL )); this.ise.getDataBindingContext().bindValue( SWTObservables.observeText( this.suComponentText ), EMFEditObservables.observeValue( this.ise.getEditingDomain(), su.getTarget(), JbiPackage.Literals.TARGET__COMPONENT_NAME )); return section.getParent(); } }