/** * <copyright> * Copyright (c) 2008, 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 * </copyright> */ package org.eclipse.bpel.ui.properties; import org.eclipse.bpel.common.ui.assist.FieldAssistAdapter; import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants; 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.MessageExchange; import org.eclipse.bpel.model.util.BPELUtils; import org.eclipse.bpel.ui.BPELUIPlugin; import org.eclipse.bpel.ui.IBPELUIConstants; import org.eclipse.bpel.ui.IHelpContextIds; import org.eclipse.bpel.ui.Messages; import org.eclipse.bpel.ui.adapters.ILabeledElement; import org.eclipse.bpel.ui.commands.AddMessageExchangeCommand; import org.eclipse.bpel.ui.commands.CompoundCommand; import org.eclipse.bpel.ui.commands.SetMessageExchangeCommand; import org.eclipse.bpel.ui.details.providers.MessageExchangeContentProvider; import org.eclipse.bpel.ui.details.providers.ModelLabelProvider; import org.eclipse.bpel.ui.proposal.providers.ModelContentProposalProvider; import org.eclipse.bpel.ui.proposal.providers.RunnableProposal; import org.eclipse.bpel.ui.proposal.providers.Separator; import org.eclipse.bpel.ui.util.BPELUtil; import org.eclipse.bpel.ui.util.ModelHelper; import org.eclipse.bpel.ui.util.MultiObjectAdapter; import org.eclipse.bpel.ui.util.NameDialog; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.commands.Command; import org.eclipse.jface.fieldassist.ContentProposalAdapter; import org.eclipse.jface.fieldassist.IContentProposal; import org.eclipse.jface.fieldassist.IContentProposalListener; import org.eclipse.jface.fieldassist.IControlContentAdapter; import org.eclipse.jface.fieldassist.TextContentAdapter; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; /** * @author Miriam Grundig (MGrundig@de.ibm.com) */ public class MessageExchangeSection extends BPELPropertySection { Composite parentComposite; //SWT widgets private Label messExLabel; private Text messExName; private Button messExBrowseButton; private IControlContentAdapter fTextContentAdapter = new TextContentAdapter() { @Override public void insertControlContents(Control control, String text, int cursorPosition) { if (text != null) { super.insertControlContents(control, text, cursorPosition); } } @Override public void setControlContents(Control control, String text, int cursorPosition) { if (text != null) { super.setControlContents(control, text, cursorPosition); } } }; //TODO check this @Override protected MultiObjectAdapter[] createAdapters() { return new MultiObjectAdapter[] { /* model object */ new MultiObjectAdapter() { @Override public void notify (Notification n) { try { if (ModelHelper.isMessageExchangeAffected(getInput(), n)) { updateMessExWidgets(); } } catch (Exception e) { BPELUIPlugin.log(e); } } }, }; } @SuppressWarnings("nls") @Override /** * Depending on the element selected a entry for the table will be defined */ protected void basicSetInput (EObject input) { super.basicSetInput(input); updateMessExWidgets(); } protected void createMessExWidgets(Composite composite) { // create items messExLabel = fWidgetFactory.createLabel(composite, Messages.MessageExchangeImplSection_1); messExName = fWidgetFactory.createText(composite, EMPTY_STRING, SWT.NONE); messExBrowseButton = fWidgetFactory.createButton(composite,EMPTY_STRING,SWT.ARROW | SWT.DOWN | SWT.RIGHT ); // Content Assist for Message Exchange RunnableProposal proposal = new RunnableProposal() { @Override public String getLabel() { return Messages.MessageExchangeImplSection_Create_Global; } public void run() { createMessageExchange ( BPELUtils.getProcess( getInput () ) , null ); } }; RunnableProposal proposal2 = new RunnableProposal() { @Override public String getLabel() { return Messages.MessageExchangeImplSection_Create_Local; } public void run() { createMessageExchange ( ModelHelper.getContainingScope( getInput()), null); } }; RunnableProposal proposal3 = new RunnableProposal() { @Override public String getLabel() { return Messages.MessageExchangeImplSection_Clear; } public void run() { Command cmd = new SetMessageExchangeCommand(getInput(), null) ; cmd.setLabel(IBPELUIConstants.CMD_ADD_MESSAGEEXCHANGE); runCommand(cmd); } }; MessageExchangeContentProvider provider = new MessageExchangeContentProvider(); ModelContentProposalProvider proposalProvider; proposalProvider = new ModelContentProposalProvider( new ModelContentProposalProvider.ValueProvider () { @Override public Object value() { return getInput(); } }, provider ); proposalProvider.addProposalToEnd( new Separator () ); proposalProvider.addProposalToEnd( proposal ); proposalProvider.addProposalToEnd( proposal2 ); proposalProvider.addProposalToEnd( proposal3 ); final FieldAssistAdapter contentAssist = new FieldAssistAdapter ( messExName, fTextContentAdapter, proposalProvider, null, null, false ); // installDecoration = false --> no icon that shows that we have content assist. contentAssist.setLabelProvider( new ModelLabelProvider () ); contentAssist.setPopupSize( new Point(300,100) ); contentAssist.setFilterStyle(ContentProposalAdapter.FILTER_CUMULATIVE); contentAssist.setProposalAcceptanceStyle( ContentProposalAdapter.PROPOSAL_REPLACE); contentAssist.addContentProposalListener( proposal ); contentAssist.addContentProposalListener( proposal2 ); contentAssist.addContentProposalListener( proposal3 ); contentAssist.addContentProposalListener(new IContentProposalListener () { public void proposalAccepted(IContentProposal chosenProposal) { if (chosenProposal.getContent() == null) { return ; } MessageExchange me = null; try { me = (MessageExchange) ((Adapter)chosenProposal).getTarget(); } catch (Throwable t) { return ; } Command cmd = new SetMessageExchangeCommand(getInput(),me); cmd.setLabel(IBPELUIConstants.CMD_ADD_MESSAGEEXCHANGE); runCommand(cmd); } }); // Open content assist window on button click messExBrowseButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { contentAssist.openProposals(); } }); messExName.addListener(SWT.KeyDown, new Listener () { public void handleEvent(Event event) { if (event.keyCode == SWT.CR) { findAndSetOrCreateMessageExchange( messExName.getText() ); } } }); // End of content assist for message exchange // Layout FlatFormData data = new FlatFormData(); data.right = new FlatFormAttachment(100, 0); data.top = new FlatFormAttachment(messExName,+2,SWT.TOP); data.bottom = new FlatFormAttachment(messExName,-2,SWT.BOTTOM); messExBrowseButton.setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0, BPELUtil.calculateLabelWidth(messExLabel, STANDARD_LABEL_WIDTH_SM)); data.right = new FlatFormAttachment(messExBrowseButton, 0); messExName.setLayoutData(data); data = new FlatFormData(); data.left = new FlatFormAttachment(0, 0); data.right = new FlatFormAttachment(messExName, -IDetailsAreaConstants.HSPACE); data.top = new FlatFormAttachment(messExName, 0, SWT.CENTER); messExLabel.setLayoutData(data); } @Override protected void createClient(Composite parent) { Composite composite = parentComposite = createFlatFormComposite(parent); createMessExWidgets(composite); PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, IHelpContextIds.PROPERTY_PAGE_MESSAGE_EXCHANGE); } /** * @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) { messExName.setFocus(); } void findAndSetOrCreateMessageExchange ( String name ) { name = name.trim(); EObject model = getInput(); MessageExchange me = null; if (name.length() > 0) { me = (MessageExchange) ModelHelper.findElementByName(ModelHelper.getContainingScope(model), name, MessageExchange.class); // does not exist if (me == null) { createMessageExchange ( ModelHelper.getContainingScope(model), name ); return ; } } SetMessageExchangeCommand cmd = new SetMessageExchangeCommand(model, me); cmd.setLabel(IBPELUIConstants.CMD_ADD_MESSAGEEXCHANGE); runCommand (cmd); } private void createMessageExchange ( EObject ref , String name ) { MessageExchange me = BPELFactory.eINSTANCE.createMessageExchange(); if (name == null) { name = EMPTY_STRING; } // ask for the name, we know the type. NameDialog nameDialog = new NameDialog( parentComposite.getShell(), Messages.MessageExchange_Create_Dialog_Title, Messages.MessageExchange_Create_Dialog_NameField_Label, name, BPELUtil.getNCNameValidator()); if (nameDialog.open() == Window.CANCEL) return ; // set name me.setName ( nameDialog.getValue() ); CompoundCommand cmd = new CompoundCommand(); cmd.add(new AddMessageExchangeCommand(ref, me)); cmd.add(new SetMessageExchangeCommand(getInput(), me)); cmd.setLabel(IBPELUIConstants.CMD_ADD_MESSAGEEXCHANGE); runCommand( cmd ); } private void updateMessExWidgets() { MessageExchange messEx = ModelHelper.getMessageExchange(getInput()); if (messEx == null) { messExName.setText(EMPTY_STRING); } else { ILabeledElement labeledElement = BPELUtil.adapt(messEx, ILabeledElement.class); messExName.setText(labeledElement.getLabel(messEx)); } } }