/*******************************************************************************
 * 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 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.editparts;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.bpel.model.BPELPackage;
import org.eclipse.bpel.model.CorrelationSets;
import org.eclipse.bpel.model.BPELExtensibleElement;
import org.eclipse.bpel.model.MessageExchanges;
import org.eclipse.bpel.model.PartnerLinks;
import org.eclipse.bpel.model.Process;
import org.eclipse.bpel.model.Variables;
import org.eclipse.bpel.ui.adapters.IContainer;
import org.eclipse.bpel.ui.adapters.delegates.ActivityContainer;


public class ProcessOutlineEditPart extends OutlineTreeEditPart {

	// protected ReferencePartnerLinks referencePartners = UiextensionmodelFactory.eINSTANCE.createReferencePartnerLinks();

	@Override
	protected void createEditPolicies() {
		super.createEditPolicies();
		// installEditPolicy(EditPolicy.LAYOUT_ROLE, new ProcessLayoutEditPolicy());
	}
	@Override
	protected void addAllAdapters() {
		super.addAllAdapters();
		if (getModel() instanceof Process) {
			Process process = (Process)getModel();
			if (process.getVariables() != null)  adapter.addToObject(process.getVariables());
			if (process.getPartnerLinks() != null)  adapter.addToObject(process.getPartnerLinks());
			if (process.getCorrelationSets() != null)  adapter.addToObject(process.getCorrelationSets());
			if (process.getMessageExchanges() != null)  adapter.addToObject(process.getMessageExchanges());
		}
	}

	@Override
	protected List<BPELExtensibleElement> getModelChildren() {
		Process process = (Process)getModel();
		List<BPELExtensibleElement> list = new ArrayList<BPELExtensibleElement>();

		PartnerLinks links = process.getPartnerLinks();
		if (links != null) {
			list.add(links);
			// 
			// referencePartners.setPartnerLinks(links);
			// list.add(referencePartners);
		}

		Variables variables = process.getVariables();
		if (variables != null) {
			list.add(variables);
		}
		
		CorrelationSets sets = process.getCorrelationSets();
		if (sets != null) {
			list.add(sets);
		}
		
		MessageExchanges exchanges = process.getMessageExchanges();
		if (exchanges != null) {
			list.add(exchanges);
		}

		IContainer container = new ActivityContainer(BPELPackage.eINSTANCE.getProcess_Activity());
		List list2 = container.getChildren(process);
		list.addAll(list2);
		return list;
	}
}
