/******************************************************************************
* Copyright (c) 2010-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.eip.designer.tabbedproperties;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import com.ebmwebsourcing.petals.common.internal.provisional.utils.PetalsConstants;
import com.ebmwebsourcing.petals.services.eip.PetalsEipPlugin;
import com.ebmwebsourcing.petals.services.eip.designer.edit.commands.EndpointSetAttributeCommand;
import com.ebmwebsourcing.petals.services.eip.designer.edit.parts.EndpointEditPart;
import com.ebmwebsourcing.petals.services.eip.designer.model.AbstractNode;
import com.ebmwebsourcing.petals.services.eip.designer.model.Endpoint;
import com.ebmwebsourcing.petals.services.explorer.model.EndpointBean;
import com.ebmwebsourcing.petals.services.utils.ConsumeUtils;
/**
* The main (and only one) section for the Petals tab (properties of a JBI binding).
* @author Vincent Zurczak - EBM WebSourcing
*/
public class EndpointInterfaceSection extends AbstractPropertySection implements PropertyChangeListener {
private Endpoint edpt;
private boolean enableListener;
private Text itfNsText, itfNameText, srvNsText, srvNameText, edptText;
private Image ideaImg;
/**
* Constructor.
*/
public EndpointInterfaceSection() {
try {
ImageDescriptor desc = PetalsEipPlugin.getImageDescriptor( "icons/obj16/smartmode_co.gif" );
this.ideaImg = desc.createImage();
} catch( Exception e ) {
PetalsEipPlugin.log( e, IStatus.WARNING );
}
}
/*
* (non-Jsdoc)
* @see java.beans.PropertyChangeListener
* #propertyChange(java.beans.PropertyChangeEvent)
*/
public void propertyChange( PropertyChangeEvent evt ) {
if( AbstractNode.PROPERTY_SERVICE_NAME.equals( evt.getPropertyName())
|| AbstractNode.PROPERTY_SERVICE_NAMESPACE.equals( evt.getPropertyName())
|| AbstractNode.PROPERTY_INTERFACE_NAME.equals( evt.getPropertyName())
|| AbstractNode.PROPERTY_INTERFACE_NAMESPACE.equals( evt.getPropertyName())
|| AbstractNode.PROPERTY_ENDPOINT_NAME.equals( evt.getPropertyName()))
refresh();
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection
* #dispose()
*/
@Override
public void dispose() {
if( this.ideaImg != null ) {
this.ideaImg.dispose();
this.ideaImg = null;
}
super.dispose();
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection
* #createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
*/
@Override
public void createControls( Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage ) {
// Create the container
super.createControls( parent, aTabbedPropertySheetPage );
final Composite container = getWidgetFactory().createPlainComposite( parent, SWT.NONE );
container.setLayout( new GridLayout( 4, false ));
Composite subContainer = getWidgetFactory().createComposite( container );
GridData layoutData = new GridData( GridData.FILL_HORIZONTAL );
layoutData.horizontalSpan = 4;
subContainer.setLayoutData( layoutData );
GridLayout layout = new GridLayout();
layout.marginBottom = 5;
layout.marginTop = 5;
layout.marginWidth = 0;
subContainer.setLayout( layout );
getWidgetFactory().createLabel( subContainer, "Define the properties of the Petals service to invoke." );
// Interface
CLabel label = getWidgetFactory().createCLabel( container, "Interface name:" );
label.setToolTipText( "The local part of the interface name" );
this.itfNameText = getWidgetFactory().createText( container, "" );
this.itfNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
this.itfNameText.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
if( EndpointInterfaceSection.this.enableListener ) {
EndpointSetAttributeCommand cmd =
new EndpointSetAttributeCommand( AbstractNode.PROPERTY_INTERFACE_NAME );
cmd.setEndpoint( EndpointInterfaceSection.this.edpt );
cmd.setNewValue( EndpointInterfaceSection.this.itfNameText.getText());
executeCommand( cmd );
}
}
});
label = getWidgetFactory().createCLabel( container, "Interface namespace:" );
label.setToolTipText( "The name space URI of the interface name" );
this.itfNsText = getWidgetFactory().createText( container, "" );
this.itfNsText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
this.itfNsText.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
if( EndpointInterfaceSection.this.enableListener ) {
EndpointSetAttributeCommand cmd =
new EndpointSetAttributeCommand( AbstractNode.PROPERTY_INTERFACE_NAMESPACE );
cmd.setEndpoint( EndpointInterfaceSection.this.edpt );
cmd.setNewValue( EndpointInterfaceSection.this.itfNsText.getText());
executeCommand( cmd );
}
}
});
// Service
label = getWidgetFactory().createCLabel( container, "Service name:" );
label.setToolTipText( "The local part of the service name" );
this.srvNameText = getWidgetFactory().createText( container, "" );
this.srvNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
this.srvNameText.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
if( EndpointInterfaceSection.this.enableListener ) {
EndpointSetAttributeCommand cmd =
new EndpointSetAttributeCommand( AbstractNode.PROPERTY_SERVICE_NAME );
cmd.setEndpoint( EndpointInterfaceSection.this.edpt );
cmd.setNewValue( EndpointInterfaceSection.this.srvNameText.getText());
executeCommand( cmd );
}
}
});
label = getWidgetFactory().createCLabel( container, "Service namespace:" );
label.setToolTipText( "The name space URI of the service name" );
this.srvNsText = getWidgetFactory().createText( container, "" );
this.srvNsText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
this.srvNsText.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
if( EndpointInterfaceSection.this.enableListener ) {
EndpointSetAttributeCommand cmd =
new EndpointSetAttributeCommand( AbstractNode.PROPERTY_SERVICE_NAMESPACE );
cmd.setEndpoint( EndpointInterfaceSection.this.edpt );
cmd.setNewValue( EndpointInterfaceSection.this.srvNsText.getText());
executeCommand( cmd );
}
}
});
// End-point
label = getWidgetFactory().createCLabel( container, "End-point name:" );
label.setToolTipText( "The end-point name (a simple string)" );
this.edptText = getWidgetFactory().createText( container, "" );
this.edptText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
this.edptText.addModifyListener( new ModifyListener() {
public void modifyText( ModifyEvent e ) {
if( EndpointInterfaceSection.this.enableListener ) {
EndpointSetAttributeCommand cmd =
new EndpointSetAttributeCommand( AbstractNode.PROPERTY_ENDPOINT_NAME );
cmd.setEndpoint( EndpointInterfaceSection.this.edpt );
cmd.setNewValue( EndpointInterfaceSection.this.edptText.getText());
executeCommand( cmd );
}
}
});
// Baaaad...
getWidgetFactory().createLabel( container, "" );
getWidgetFactory().createLabel( container, "" );
getWidgetFactory().createLabel( container, "" );
// Add the helper to select another Petals service
subContainer = getWidgetFactory().createComposite( container );
layoutData = new GridData( GridData.FILL_HORIZONTAL );
layoutData.horizontalSpan = 3;
subContainer.setLayoutData( layoutData );
layout = new GridLayout( 2, false );
layout.marginWidth = 0;
subContainer.setLayout( layout );
label = getWidgetFactory().createCLabel( subContainer, "" );
label.setImage( this.ideaImg );
Hyperlink link = getWidgetFactory().createHyperlink( subContainer, "Select a service from the Petals Services view", SWT.NONE );
link.setToolTipText( "Select an end-point to invoke among the currently referenced end-points" );
link.addHyperlinkListener( new HyperlinkAdapter() {
@Override
public void linkActivated( HyperlinkEvent e ) {
EndpointBean bean = ConsumeUtils.selectEndpointToConsume( container );
if( bean == null )
return;
try {
EndpointInterfaceSection.this.srvNameText.setText( bean.getServiceName().getLocalPart());
EndpointInterfaceSection.this.srvNsText.setText( bean.getServiceName().getNamespaceURI());
EndpointInterfaceSection.this.itfNameText.setText( bean.getInterfaceName().getLocalPart());
EndpointInterfaceSection.this.itfNsText.setText( bean.getInterfaceName().getNamespaceURI());
if( PetalsConstants.AUTO_GENERATE.equals( bean.getEndpointName()))
EndpointInterfaceSection.this.edptText.setText( "" );
else
EndpointInterfaceSection.this.edptText.setText( bean.getEndpointName());
} catch( Exception e1 ) {
PetalsEipPlugin.log( e1, IStatus.ERROR );
}
}
});
}
/**
* Executes a command on top of the EIP editor's command stack.
* @param command
*/
private void executeCommand( Command command ) {
IEditorPart part = getPart().getSite().getPage().getActiveEditor();
CommandStack commandStack = (CommandStack) part.getAdapter( CommandStack.class );
if( commandStack != null )
commandStack.execute( command );
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection
* #setInput(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
*/
@Override
public void setInput( IWorkbenchPart part, ISelection selection ) {
super.setInput( part, selection );
// Do not listen to model changes from the previous input
if( this.edpt != null )
this.edpt.removePropertyChangeListener( this );
if( selection instanceof IStructuredSelection ) {
Object input = ((IStructuredSelection) selection).getFirstElement();
if( input instanceof EndpointEditPart )
this.edpt = (Endpoint) ((EndpointEditPart) input).getModel();
}
// Listen to changes in the new model
if( this.edpt != null )
this.edpt.addPropertyChangeListener( this );
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection
* #refresh()
*/
@Override
public void refresh() {
this.enableListener = false;
if( this.itfNsText != null
&& ! this.itfNsText.isDisposed()
&& this.edpt != null ) {
// Save the caret position
Text focusText = null;
if( this.itfNsText.isFocusControl())
focusText = this.itfNsText;
else if( this.itfNameText.isFocusControl())
focusText = this.itfNameText;
else if( this.srvNameText.isFocusControl())
focusText = this.srvNameText;
else if( this.srvNsText.isFocusControl())
focusText = this.srvNsText;
else if( this.edptText.isFocusControl())
focusText = this.edptText;
int caret = focusText != null ? focusText.getCaretPosition() : -1;
// Update values
this.itfNsText.setText( this.edpt.getInterfaceNamespace() != null ? this.edpt.getInterfaceNamespace() : "" );
this.itfNameText.setText( this.edpt.getInterfaceName() != null ? this.edpt.getInterfaceName() : "" );
this.srvNsText.setText( this.edpt.getServiceNamespace() != null ? this.edpt.getServiceNamespace() : "" );
this.srvNameText.setText( this.edpt.getServiceName() != null ? this.edpt.getServiceName() : "" );
this.edptText.setText( this.edpt.getEndpointName() != null ? this.edpt.getEndpointName() : "" );
// Restore the caret
if( focusText != null )
focusText.setSelection( caret );
}
this.enableListener = true;
}
}