/*******************************************************************************
 * 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.HashSet;
import java.util.Set;

import org.eclipse.bpel.common.ui.details.IDetailsAreaConstants;
import org.eclipse.bpel.common.ui.details.viewers.CComboViewer;
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.BPELPackage;
import org.eclipse.bpel.model.PartnerLink;
import org.eclipse.bpel.model.partnerlinktype.PartnerLinkType;
import org.eclipse.bpel.model.partnerlinktype.PartnerlinktypeFactory;
import org.eclipse.bpel.model.partnerlinktype.PartnerlinktypePackage;
import org.eclipse.bpel.model.partnerlinktype.Role;
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.CompoundCommand;
import org.eclipse.bpel.ui.commands.SetCommand;
import org.eclipse.bpel.ui.commands.util.AutoUndoCommand;
import org.eclipse.bpel.ui.details.providers.AddSelectedObjectFilter;
import org.eclipse.bpel.ui.details.providers.ModelTreeLabelProvider;
import org.eclipse.bpel.ui.details.providers.OperationsTreeContentProvider;
import org.eclipse.bpel.ui.util.BPELUtil;
import org.eclipse.bpel.ui.util.BatchedMultiObjectAdapter;
import org.eclipse.bpel.ui.util.BrowseUtil;
import org.eclipse.bpel.ui.util.ModelHelper;
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.emf.ecore.EStructuralFeature;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.Hyperlink;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.PortType;

/**
 * VariableTypeSection provides viewing and editing of the type of a BPEL variable
 * (whether that be an XSD type, WSDL message, or built-in simple type).
 */

@SuppressWarnings("boxing")

public class PartnerLinkImplSection extends BPELPropertySection {

	private static final int BID_MY_ROLE_1 = 1;
	private static final int BID_MY_ROLE_2 = 2;
	private static final int BID_MY_ROLE_NONE = 3;
	
	private static final int BID_PARTNER_ROLE_1 = 101;
	private static final int BID_PARTNER_ROLE_2 = 102;
	private static final int BID_PARTNER_ROLE_NONE = 103;
	
	private static final int BID_INITIALIZE_PARTNER_ROLE = 201;
	
	
	private static final Role[] NO_ROLES = {};		
	
	
	/**
	 * @see org.eclipse.ui.views.properties.tabbed.AbstractPropertySection#shouldUseExtraSpace()
	 */
	@Override
	public boolean shouldUseExtraSpace() { 
		return true; 
	}
	
	protected boolean inUpdate = false;
	
	protected Composite interfaceComposite, referenceComposite;

	protected Composite parentComposite;
	
	protected Button interfaceBrowseButton;
	protected AddSelectedObjectFilter interfaceAddSelectedObjectFilter;

	protected CComboViewer referenceViewer;
	protected Button referenceBrowseButton;
	protected AddSelectedObjectFilter referenceAddSelectedObjectFilter;

	protected int lastChangeContext = -1;
	
	private Button partnerLinkTypeBrowseButton;
	
	private Button fMyRole1;
	private Button fMyRole2;
	private Button fMyRoleNone;
	private Button fPartnerRole1;
	private Button fPartnerRole2;
	private Button fPartnerRoleNone;
	private Role[] fRoles;
	
	private TreeViewer fMyOperationsTreeViewer;
	private TreeViewer fPartnerOperationsTreeViewer;
	
	private Hyperlink fPartnerLinkTypeHref;
	
	private StatusLabel2 fPartnerLinkTypeLabel;
	
	private Button fInitializePartnerRole;
	

	static Set<EStructuralFeature> notificationInterest = new HashSet<EStructuralFeature>();
	static {
		notificationInterest.add ( BPELPackage.eINSTANCE.getPartnerLink_PartnerLinkType() );
		notificationInterest.add ( BPELPackage.eINSTANCE.getPartnerLink_MyRole() );
		notificationInterest.add ( BPELPackage.eINSTANCE.getPartnerLink_PartnerRole() );	
		notificationInterest.add ( BPELPackage.eINSTANCE.getPartnerLink_InitializePartnerRole() );
		
		notificationInterest.add ( PartnerlinktypePackage.eINSTANCE.getPartnerLinkType_Role() );
		notificationInterest.add ( PartnerlinktypePackage.eINSTANCE.getRole_PortType() );
		notificationInterest.add ( PartnerlinktypePackage.eINSTANCE.getRole_Name() );
	}
		
	
	@Override
	protected MultiObjectAdapter[] createAdapters() {
		return new MultiObjectAdapter[] {
			/* model object */
			new BatchedMultiObjectAdapter() {
				boolean updateInterface = false;
				boolean refreshAdapters = false;
				
				@Override
				public void notify(Notification n) {
					updateInterface = updateInterface || notificationInterest.contains( n.getFeature() );
					refreshAdapters = refreshAdapters || updateInterface;
				}
				
				@Override
				public void finish() {
					if (updateInterface) {
						updatePartnerLinkTypeWidgets();
						doChildLayout();
						updateInterface = false;
					}
					if (refreshAdapters) {
						refreshAdapters();
						refreshAdapters = false;
					}
				}
			}
		};
	}

	@Override
	protected void addAllAdapters() {
		super.addAllAdapters();
		if (fAdapters.length > 0) {
			PartnerLink partnerLink = (PartnerLink)getInput();
			if (partnerLink.getPartnerLinkType() != null) {
				fAdapters[0].addToObject(partnerLink.getPartnerLinkType());
			}
			Role[] roles = {partnerLink.getMyRole(), partnerLink.getPartnerRole()};
			for (int i = 0; i < roles.length; i++) {
				Role role = roles[i];
				if (role != null) {
					fAdapters[0].addToObject(role);
				}
			}
		}
	}
	
	
	
	protected Composite createPartnerLinkTypeWidgets (Composite top, final Composite parent) {
		
		FlatFormData data;

		Composite composite = createFlatFormComposite(parent);
		data = new FlatFormData();
		if (top == null) {
			data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VMARGIN);
		} else {
			data.top = new FlatFormAttachment(top,IDetailsAreaConstants.VMARGIN);
		}
		data.left = new FlatFormAttachment(0, 0);
		data.right = new FlatFormAttachment(100, 0);
		
		composite.setLayoutData(data);
			
		partnerLinkTypeBrowseButton = fWidgetFactory.createButton(composite, Messages.PartnerLinkImplSection_Browse_1, SWT.PUSH); 

		DecoratedLabel label = new DecoratedLabel ( composite, SWT.LEFT );
		label.setText( Messages.PartnerLinkImplSection_0 );
		fWidgetFactory.adapt(label);
		
		fPartnerLinkTypeLabel = new StatusLabel2 ( label ); 

		fPartnerLinkTypeHref = fWidgetFactory.createHyperlink(composite, "", SWT.NONE); //$NON-NLS-1$
		fPartnerLinkTypeHref.addHyperlinkListener(new HyperlinkAdapter() {
			
			@Override
			public void linkActivated(HyperlinkEvent e) {
				PartnerLinkType plt = getPartnerLinkType();
				if (plt == null) {
					return ;
				}				
				BPELUtil.openEditor(getPartnerLinkType(), getBPELEditor());
			}
		});
		fPartnerLinkTypeHref.setToolTipText(Messages.PartnerLinkImplSection_1);
				
		 
		partnerLinkTypeBrowseButton.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {				
				browseForPartnerLink();
			}
			public void widgetDefaultSelected(SelectionEvent e) { }
		});
		

		data = new FlatFormData();
		data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE);
		// data.bottom = new FlatFormAttachment(fPartnerLinkTypeHref, -2, SWT.BOTTOM);
		data.right = new FlatFormAttachment(100,-IDetailsAreaConstants.HSPACE);
		partnerLinkTypeBrowseButton.setLayoutData(data);		
		
		data = new FlatFormData();
		data.left = new FlatFormAttachment(0,IDetailsAreaConstants.HSPACE);		
		data.top = new FlatFormAttachment(0, IDetailsAreaConstants.VSPACE );
		fPartnerLinkTypeLabel.setLayoutData(data);
	
//		data = new FlatFormData();
//		data.left = new FlatFormAttachment(partnerLinkTypeLabel, IDetailsAreaConstants.HSPACE);
//		data.top = new FlatFormAttachment(partnerLinkTypeLabel, -4 , SWT.TOP);
//		// data.bottom = new FlatFormAttachment(partnerLinkTypeLabel, 4 , SWT.BOTTOM);
//		data.right = new FlatFormAttachment( partnerLinkTypeBrowseButton, -30 );
//		partnerLinkTypeName.setLayoutData(data);		
						
		data = new FlatFormData();
		data.right = new FlatFormAttachment( 60, 0 );
		data.left = new FlatFormAttachment ( fPartnerLinkTypeLabel.getLabel() , 20);
		data.bottom = new FlatFormAttachment ( fPartnerLinkTypeLabel.getLabel(), -1 , SWT.BOTTOM);
		fPartnerLinkTypeHref.setLayoutData(data);
		
		return composite;
		
	}

	protected void browseForPartnerLink ( ) {
		
		Object obj = BrowseUtil.browseForPartnerLinkType( getInput() , 
				partnerLinkTypeBrowseButton.getShell() );
		if (obj == null) {
			return;
		}
		
		if (obj instanceof PartnerLinkType) {
			setPartnerLinkType ( (PartnerLinkType) obj);
		}						
	}


	protected Composite createMyRolePartnerRoleWidgets ( Composite top, Composite parent) {

		Composite composite = fWidgetFactory.createComposite(parent);
		FlatFormData data = new FlatFormData();
		if (top == null) {
			data.top = new FlatFormAttachment(0,5);
		} else {
			data.top = new FlatFormAttachment(top,5);
		}		
		
		data.left = new FlatFormAttachment(0, 0);
		data.right = new FlatFormAttachment(100, 0);		
		composite.setLayoutData(data);

		
		GridLayout layout = new GridLayout();
		layout.makeColumnsEqualWidth = true;		
		layout.numColumns = 2;
		composite.setLayout(layout);
		
		GridData gridData;
				
				
		Group myGroup = fWidgetFactory.createGroup(composite,Messages.PartnerLinkImplSection_2);		
		layout = new GridLayout();
		layout.makeColumnsEqualWidth = false;		
		layout.numColumns = 3;		
		myGroup.setLayout(layout);
		gridData = new GridData();        
		gridData.grabExcessVerticalSpace = false;
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		gridData.verticalAlignment = GridData.FILL;
		gridData.horizontalIndent = 10;
		gridData.minimumWidth = 150;
		myGroup.setLayoutData(gridData);

		fMyRole1 = createButton(myGroup, null, BID_MY_ROLE_1,    false, SWT.RADIO );
		fMyRole2 = createButton(myGroup, null, BID_MY_ROLE_2,    false, SWT.RADIO);
		fMyRoleNone = createButton(myGroup, Messages.PartnerLinkImplSection_10, BID_MY_ROLE_NONE, true,  SWT.RADIO);
		
		updateRadio(fMyRole1, null);
		updateRadio(fMyRole2, null);
		
		Group partnerGroup = fWidgetFactory.createGroup(composite, Messages.PartnerLinkImplSection_4);		
		
		layout = new GridLayout();
		layout.makeColumnsEqualWidth = false;		
		layout.numColumns = 3;		
		partnerGroup.setLayout(layout);
		gridData = new GridData();        
		gridData.grabExcessVerticalSpace = false;
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		gridData.verticalAlignment = GridData.FILL;
		gridData.horizontalIndent = 10;
		gridData.minimumWidth = 150;
		partnerGroup.setLayoutData(gridData);
		
		fPartnerRole1 = createButton(partnerGroup, null, BID_PARTNER_ROLE_1,    false, SWT.RADIO);
		fPartnerRole2 = createButton(partnerGroup, null, BID_PARTNER_ROLE_2,    false, SWT.RADIO);
		fPartnerRoleNone = createButton(partnerGroup, Messages.PartnerLinkImplSection_5, BID_PARTNER_ROLE_NONE, true, SWT.RADIO);

		// The initialize partner role button
		fInitializePartnerRole = createButton(partnerGroup, Messages.PartnerLinkImplSection_11, BID_INITIALIZE_PARTNER_ROLE, false, SWT.CHECK);

		
		updateRadio(fPartnerRole1, null);
		updateRadio(fPartnerRole2, null);		
		
		
		return composite;
	}
	
	protected Composite createRoleWidgets ( Composite top, Composite parent) {
		return createMyRolePartnerRoleWidgets(top, parent);
	}
	
	
	protected Composite createPartnerLinkStructureWidgets (Composite top, Composite parent) {
		
		Composite composite = createFlatFormComposite(parent);
		
		FlatFormData data = new FlatFormData();
		if (top == null) {
			data.top = new FlatFormAttachment(0,5);
		} else {
			data.top = new FlatFormAttachment(top,5);
		}		
		
		data.left = new FlatFormAttachment(0, 0);
		data.right = new FlatFormAttachment(100, 0);
		data.bottom = new FlatFormAttachment(100,0);
		
		composite.setLayoutData(data);
			
		Label treeLabel = fWidgetFactory.createLabel(composite, Messages.PartnerLinkImplSection_6); 
		
		// Tree viewer for variable structure ...
		Tree tree  = fWidgetFactory.createTree(composite, SWT.NONE);		
		fMyOperationsTreeViewer = new TreeViewer( tree );
		fMyOperationsTreeViewer.setContentProvider(  new OperationsTreeContentProvider(true) );
		fMyOperationsTreeViewer.setLabelProvider(new ModelTreeLabelProvider());
		fMyOperationsTreeViewer.setInput ( null );
		fMyOperationsTreeViewer.setAutoExpandLevel(4);
		
		// end tree viewer for variable structure
		
		data = new FlatFormData();
		data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE + 10 );
		data.top = new FlatFormAttachment(treeLabel, IDetailsAreaConstants.VSPACE, SWT.BOTTOM);
		treeLabel.setLayoutData(data);

		data = new FlatFormData();
		data.left = new FlatFormAttachment(0, IDetailsAreaConstants.HSPACE + 10 );
		data.top = new FlatFormAttachment(treeLabel,IDetailsAreaConstants.HSPACE, SWT.BOTTOM);
		data.right = new FlatFormAttachment(50,  -IDetailsAreaConstants.HSPACE) ;		
		data.bottom = new FlatFormAttachment(100, -IDetailsAreaConstants.HSPACE);	
		tree.setLayoutData(data);

		
		treeLabel = fWidgetFactory.createLabel(composite, Messages.PartnerLinkImplSection_7); 
		
		// Tree viewer for variable structure ...
		tree = fWidgetFactory.createTree(composite, SWT.NONE);		
		fPartnerOperationsTreeViewer = new TreeViewer( tree );
		fPartnerOperationsTreeViewer.setContentProvider(new OperationsTreeContentProvider(true));
		fPartnerOperationsTreeViewer.setLabelProvider(new ModelTreeLabelProvider());
		fPartnerOperationsTreeViewer.setInput ( null );
		fPartnerOperationsTreeViewer.setAutoExpandLevel(4);
		
		// end tree viewer for variable structure
		
		data = new FlatFormData();
		data.left = new FlatFormAttachment(50, IDetailsAreaConstants.HSPACE + 10 );
		data.top = new FlatFormAttachment(treeLabel, IDetailsAreaConstants.VSPACE, SWT.BOTTOM);
		treeLabel.setLayoutData(data);

		data = new FlatFormData();
		data.left = new FlatFormAttachment(50, IDetailsAreaConstants.HSPACE + 10 );
		data.top = new FlatFormAttachment(treeLabel,IDetailsAreaConstants.HSPACE, SWT.BOTTOM);
		data.right = new FlatFormAttachment(100,  -IDetailsAreaConstants.HSPACE) ;		
		data.bottom = new FlatFormAttachment(100, -IDetailsAreaConstants.HSPACE);	
		tree.setLayoutData(data);
				
		return null;
	}
	
	
	
	@Override
	protected void createClient(Composite parent) {
		
		Composite composite = parentComposite = createFlatFormComposite(parent);
				
//		FlatFormData data = new FlatFormData();
//		data.top = new FlatFormAttachment(0,0);				
//		data.left = new FlatFormAttachment(0, 0);
//		data.right = new FlatFormAttachment(100, 0);
//		data.bottom = new FlatFormAttachment(100,0);		
//		composite.setLayoutData(data);		
		
		Composite ref = createPartnerLinkTypeWidgets(null,composite);
		
		ref = createRoleWidgets ( ref, composite );
				
		createPartnerLinkStructureWidgets( ref, composite  );
		
		// createInterfaceWidgets(composite);
		// createReferenceWidgets(composite);

		PlatformUI.getWorkbench().getHelpSystem().setHelp(
			parentComposite, IHelpContextIds.PROPERTY_PAGE_PARTNER_LINK);
	}
	
	
	
	
	protected void doChildLayout() {
		parentComposite.layout(true,true);
	}	
	

	
	protected void updateMyRolePartnerRoleWidgets ( PartnerLink pl ) {
		
		PartnerLinkType plt = pl.getPartnerLinkType();
		fRoles = NO_ROLES ;
		if (plt != null) {
			fRoles = plt.getRole().toArray( NO_ROLES );			
		}
		
		Role myRole = pl.getMyRole();
		Role partnerRole = pl.getPartnerRole();
		
		
		updateRadio(fMyRole1,null);
		updateRadio(fMyRole2,null);
		updateRadio(fPartnerRole1,null);
		updateRadio(fPartnerRole2,null);

		select(fPartnerRoleNone);
		select(fMyRoleNone);
		select(fInitializePartnerRole);
		
		// Roles are 1..2, so technically, this should never happen.

		// If at least 1 role specified ...
		if (fRoles.length >= 1) {
			String role1 = fRoles[0].getName();
			
			updateRadio (fMyRole1, role1);
			updateRadio (fPartnerRole1,role1);
			
			if ( fRoles[0].equals( myRole ) ) {
				select (fMyRole1);
			} 
			if (fRoles[0].equals(partnerRole)) {
				select (fPartnerRole1);
			} 
		}
		
		Boolean ipr = pl.getInitializePartnerRole();
		
		// If at most 2 roles specified ...
		if (fRoles.length >= 2) {
			String role2 = fRoles[1].getName();
			updateRadio (fMyRole2, role2);
			updateRadio (fPartnerRole2,role2);
			
			if (fRoles[1].equals ( myRole) ) {
				select(fMyRole2);
			} 
			if (fRoles[1].equals ( partnerRole )) {
				select(fPartnerRole2);
			}
			fInitializePartnerRole.setEnabled( true );
			fInitializePartnerRole.setSelection(ipr != null && ipr );
			
		} else {
			
			fInitializePartnerRole.setSelection( false );
			fInitializePartnerRole.setEnabled( false );
		}
		
		
	}
	
	protected void updatePartnerLinkType (PartnerLink pl) {
		PartnerLinkType plt = pl.getPartnerLinkType();
		if (plt == null) {
			fPartnerLinkTypeHref.setText(Messages.PartnerLinkImplSection_8);
			// partnerLinkTypeName.setText("(None)");
			
			// added by Grid.Qian
			fPartnerLinkTypeHref.setEnabled(false);
			return;
		}
		
		String name = null;
		ILabeledElement label = BPELUtil.adapt(plt, ILabeledElement.class );
		if (label != null) {
			name = label.getLabel( plt );
		} 	
		fPartnerLinkTypeHref.setText( name );
		
		// added by Grid.Qian
		fPartnerLinkTypeHref.setEnabled(true);
		// partnerLinkTypeName.setText(name);
	}
	
	protected void updatePartnerLinkTypeWidgets() {
		Object obj = getInput();
		if (obj == null) {
			throw new IllegalStateException();
		}
		PartnerLink pl = (PartnerLink) obj;
		updateMyRolePartnerRoleWidgets( pl );
		updatePartnerLinkType (pl);
		
		
		fMyOperationsTreeViewer.setInput( ModelHelper.getPartnerPortType(pl, ModelHelper.INCOMING) );
		fPartnerOperationsTreeViewer.setInput( ModelHelper.getPartnerPortType(pl, ModelHelper.OUTGOING ) );
		
		updateMarkers();
	}
	
	
	protected PartnerLinkType getPartnerLinkType () {
		PartnerLink pl = (PartnerLink) fModelObject;
		return pl.getPartnerLinkType();
	}
	
	
	
	@Override
	protected void basicSetInput(EObject newInput) {
		
		super.basicSetInput(newInput);
		
		updatePartnerLinkTypeWidgets();
		doChildLayout();		
	}

	
	/**
	 * @see org.eclipse.bpel.ui.properties.BPELPropertySection#getUserContext()
	 */
	@Override
	public Object getUserContext() {
		return Integer.valueOf( lastChangeContext );
	}
	
	
	/**
	 * @see org.eclipse.bpel.ui.properties.BPELPropertySection#restoreUserContext(java.lang.Object)
	 */
	@Override
	public void restoreUserContext(Object userContext) {
				
	}

	
	/**
	 * @param portType
	 * @param whichRole
	 */
	public void storeInterface (final PortType portType, final int whichRole) {
		
		final PartnerLink partnerLink = (PartnerLink)getInput();
		CompoundCommand cmd = new CompoundCommand();
		PartnerLinkType plt = partnerLink.getPartnerLinkType();
		
		if (((plt == null) || plt.eIsProxy()) && (portType != null)) {
			// need a PLT.
			plt = PartnerlinktypeFactory.eINSTANCE.createPartnerLinkType();
			Definition artifactsDefinition = getBPELEditor().getArtifactsDefinition();
			cmd.add(ModelHelper.getCreatePartnerLinkTypeCommand(getProcess(), partnerLink, plt, artifactsDefinition, whichRole));
		}
		if (plt != null) {
			// set port type
			cmd.add(new AutoUndoCommand(plt) {
				
	            @Override
				public void doExecute() {
	            	Role role = (whichRole == ModelHelper.MY_ROLE) ? partnerLink.getMyRole() : partnerLink.getPartnerRole();
	            	role.setPortType(portType);
	            }
	        });
		}
		
		// lastChangeContext is set by caller
		if (!cmd.isEmpty()) getCommandFramework().execute(wrapInShowContextCommand(cmd));
	}
	
	
	Button createButton (Composite parent, String label, int id, boolean checked, int type ) {
		
		Button button = fWidgetFactory.createButton(parent, label, type );
		
		button.setData( Integer.valueOf( id ));		
		button.setSelection( checked );
		
		button.addSelectionListener (new SelectionAdapter() {
			
			@Override
			public void widgetSelected (SelectionEvent event) {
				Button b = (Button) event.widget;				
				buttonPressed(((Integer) b.getData()), b.getSelection(),true);
			}
		});
		
		return button;	
	}

	
	
	void updateRadio ( Button button, String text ) {
		
		if ( text == null ) {
			button.setText(Messages.PartnerLinkImplSection_9);
			button.setEnabled(false);
			button.setSelection(false);
		} else {
			button.setText (text);
			button.setEnabled (true);
		}
	}
	
	
	
	void select ( Button button ) {
				
		if ((button.getStyle() & SWT.RADIO) == SWT.RADIO) {
			for(Control child : button.getParent().getChildren()) {
				if (button != child && child instanceof Button) {
					Button b = (Button)child;
					if ((b.getStyle() & SWT.RADIO) == SWT.RADIO) {
						unselect( b );
					}
				}
			}
		}
		
		button.setSelection(true);
		int id = ((Integer)button.getData()).intValue();
		buttonPressed( id, true, false ) ;
	}
	
	
	void unselect (Button button) {
		if (button.getSelection () ) {
			button.setSelection (false);
			int id = ((Integer)button.getData()).intValue();
			buttonPressed( id, false , false ) ;
		}
	}
	
	
	/**
	 * @param id
	 * @param selection
	 */
	protected void buttonPressed(int id, boolean selection, boolean event ) {
		
		if (!event || (!selection && id != BID_INITIALIZE_PARTNER_ROLE)) {
			// only respond to events
			return ;
		}
		
		PartnerLink pl = (PartnerLink) getInput();
		SetCommand cmd = null;
		
		// Current myRole or partnerRole may be null
		Role myRole = pl.getMyRole();
		Role partnerRole = pl.getPartnerRole();
				
		switch (id) {
		case BID_MY_ROLE_1 :
			
			if (myRole == null || myRole.equals( fRoles[0]) == false ) {			
				cmd = new SetCommand(pl,fRoles[0],BPELPackage.eINSTANCE.getPartnerLink_MyRole() );
			}			
			break;
			
		case BID_MY_ROLE_2 :
			if (myRole == null || myRole.equals( fRoles[1]) == false ) {
				cmd = new SetCommand(pl,fRoles[1],BPELPackage.eINSTANCE.getPartnerLink_MyRole() );				
			}
			break;
			
		case BID_MY_ROLE_NONE :
			if (myRole != null) {
				cmd = new SetCommand(pl,null,BPELPackage.eINSTANCE.getPartnerLink_MyRole() );				
			}
			break;
			
		case BID_PARTNER_ROLE_1 :
			if (partnerRole == null || partnerRole.equals( fRoles[0]) == false) {				
				cmd = new SetCommand(pl,fRoles[0],BPELPackage.eINSTANCE.getPartnerLink_PartnerRole() );
			}
			break;
			
		case BID_PARTNER_ROLE_2 :
			if (partnerRole == null || partnerRole.equals( fRoles[1]) == false) {
				cmd = new SetCommand(pl,fRoles[1],BPELPackage.eINSTANCE.getPartnerLink_PartnerRole() );
			}
			break;
					
		case BID_PARTNER_ROLE_NONE :
			if (partnerRole != null) {
				cmd = new SetCommand(pl,null,BPELPackage.eINSTANCE.getPartnerLink_PartnerRole() );				
			}
			break;
		case BID_INITIALIZE_PARTNER_ROLE :
			cmd = new SetCommand(pl,fInitializePartnerRole.getSelection(),BPELPackage.eINSTANCE.getPartnerLink_InitializePartnerRole() );
			break;
		}
		
		if (cmd != null) {
			getCommandFramework().execute( cmd );
		}
		
		// System.out.println("ButtonID=" + id + "; selection=" + selection);
	}
	
	
	
	private void setPartnerLinkType (PartnerLinkType type) {
		
		PartnerLink pl = (PartnerLink) getInput();
		
		CompoundCommand cmd = new CompoundCommand ();				
		cmd.add(  new SetCommand(pl, type, BPELPackage.eINSTANCE.getPartnerLink_PartnerLinkType() ) );				
		cmd.add ( new SetCommand(pl, null, BPELPackage.eINSTANCE.getPartnerLink_MyRole() ) ) ;		
		cmd.add ( new SetCommand(pl, null, BPELPackage.eINSTANCE.getPartnerLink_PartnerRole() ) );				
		getCommandFramework().execute(cmd);	
	}

	/**
	 * 
	 * @see org.eclipse.bpel.ui.properties.BPELPropertySection#isValidMarker(org.eclipse.core.resources.IMarker)
	 */
	
	@Override
	public boolean isValidMarker (IMarker marker) {

		boolean isValid = super.isValidMarker(marker);
		
		if (!isValid) {
			return false;
		}
		
		String context = null;
		try {
			context = (String) marker.getAttribute("href.context");
		} catch (Exception ex) {
			return false;
		}
		
		return "name".equals (context) == false; 
	}	
	
	

	@Override
	protected void updateMarkers () {				
		fPartnerLinkTypeLabel.clear();		
		for(IMarker m : getMarkers(getInput())) {
			fPartnerLinkTypeLabel.addStatus( BPELUtil.adapt(m, IStatus.class));
		}		
	}
	
	
}
