/****************************************************************************
 * Copyright (c) 2007, 2009 Composent, Inc. 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:
 *    Composent, Inc. - initial API and implementation
 *****************************************************************************/

package org.eclipse.team.internal.ecf.ui;

import org.eclipse.core.runtime.*;
import org.eclipse.ecf.core.*;
import org.eclipse.ecf.core.events.*;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.start.IECFStart;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.datashare.IChannelContainerAdapter;
import org.eclipse.team.internal.ecf.core.TeamSynchronization;

public class ECFStart implements IECFStart {

	IContainerListener containerListener = new IContainerListener() {

		/*
		 * (non-Javadoc)
		 * 
		 * @see
		 * org.eclipse.ecf.core.IContainerListener#handleEvent(org.eclipse.ecf
		 * .core.events.IContainerEvent)
		 */
		public void handleEvent(IContainerEvent event) {
			final IContainerManager containerManager = (IContainerManager) ContainerFactory.getDefault();
			if (containerManager == null)
				return;
			IContainer container = containerManager.getContainer(event.getLocalContainerID());
			if (container == null)
				return;
			if (event instanceof IContainerConnectedEvent || event instanceof IContainerDisconnectedEvent) {
				// connected
				IChannelContainerAdapter cca = (IChannelContainerAdapter) container.getAdapter(IChannelContainerAdapter.class);
				if (cca == null)
					return;
				ID containerID = container.getID();
				if (event instanceof IContainerConnectedEvent) {
					try {
						if (!TeamSynchronization.contains(containerID)) {
							TeamSynchronization.put(containerID, new WorkbenchAwareRemoteShare(cca));
						}
					} catch (ECFException e) {
						TeamSynchronization.log("RemoteShare could not be added or created", e); //$NON-NLS-1$
					}
				} else if (event instanceof IContainerDisconnectedEvent) {
					// disconnected
					TeamSynchronization.removeShare(containerID);
				}
			} else if (event instanceof IContainerDisposeEvent) {
				containerManager.removeListener(containerManagerListener);
				container.removeListener(containerListener);
			}
		}

	};

	IContainerManagerListener containerManagerListener = new IContainerManagerListener() {

		/*
		 * (non-Javadoc)
		 * 
		 * @see
		 * org.eclipse.ecf.core.IContainerManagerListener#containerAdded(org
		 * .eclipse.ecf.core.IContainer)
		 */
		public void containerAdded(IContainer container) {
			IChannelContainerAdapter cca = (IChannelContainerAdapter) container.getAdapter(IChannelContainerAdapter.class);
			if (cca == null)
				return;
			container.addListener(containerListener);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see
		 * org.eclipse.ecf.core.IContainerManagerListener#containerRemoved(org
		 * .eclipse.ecf.core.IContainer)
		 */
		public void containerRemoved(IContainer container) {
			container.removeListener(containerListener);
		}
	};

	/*
	 * (non-Javadoc)
	 * 
	 * @seeorg.eclipse.ecf.core.start.IECFStart#run(org.eclipse.core.runtime.
	 * IProgressMonitor)
	 */
	public IStatus run(IProgressMonitor monitor) {
		final IContainerManager containerManager = (IContainerManager) ContainerFactory.getDefault();
		containerManager.addListener(containerManagerListener);
		return Status.OK_STATUS;
	}

}
