package org.codemap.communication; import org.codemap.util.Log; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.ecf.core.IContainer; import org.eclipse.ecf.core.IContainerListener; import org.eclipse.ecf.core.IContainerManager; import org.eclipse.ecf.core.IContainerManagerListener; import org.eclipse.ecf.core.events.IContainerConnectedEvent; import org.eclipse.ecf.core.events.IContainerDisconnectedEvent; import org.eclipse.ecf.core.events.IContainerDisposeEvent; import org.eclipse.ecf.core.events.IContainerEjectedEvent; import org.eclipse.ecf.core.events.IContainerEvent; 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; public class CodemapECFStart implements IECFStart { private final IContainerListener containerListener = new IContainerListener() { /* * (non-Javadoc) * * @see org.eclipse.ecf.core.IContainerListener#handleEvent(org.eclipse.ecf.core.events.IContainerEvent) */ public void handleEvent(IContainerEvent event) { IContainerManager containerManager = ECFContribution.getDefault().getContainerManager(); if (containerManager == null) return; IContainer container = containerManager.getContainer(event.getLocalContainerID()); if (container == null) return; if (! handledConnectionEvent(event, container)) { handledDisposeEvent(event, container, containerManager); } } private boolean handledDisposeEvent(IContainerEvent event, IContainer container, IContainerManager containerManager) { if (! (event instanceof IContainerDisposeEvent)) return false; containerManager.removeListener(containerManagerListener); container.removeListener(containerListener); return true; } private boolean handledConnectionEvent(IContainerEvent event, IContainer container) { if (! (event instanceof IContainerConnectedEvent || event instanceof IContainerDisconnectedEvent)) return false; IChannelContainerAdapter containerAdapter = (IChannelContainerAdapter) container.getAdapter(IChannelContainerAdapter.class); if (containerAdapter == null) return true; ID containerID = container.getID(); if (! handledConnectedEvent(event, container, containerID, containerAdapter)) { handledDisconnectedEvent(event, containerID); } return true; } private boolean handledDisconnectedEvent(IContainerEvent event, ID containerID) { if (!(event instanceof IContainerDisconnectedEvent || event instanceof IContainerEjectedEvent)) return false; SelectionShare share = ECFContribution.getDefault().removeStringShare(containerID); if (share != null) { share.dispose(); } return true; } private boolean handledConnectedEvent(IContainerEvent event, IContainer container, ID containerID, IChannelContainerAdapter containerAdapter) { if (!(event instanceof IContainerConnectedEvent)) return false; try { ECFContribution.getDefault().addStringShare(containerID, containerAdapter); } catch (ECFException e) { Log.warning("Document share not created.", e); } return true; } }; /** * Add a IContainerListener whenever a new container is added. * * for more information on containers check out this website: {@link http://www.eclipse.org/ecf/documentation.php#Containers} * or @see IContainer. * */ private final IContainerManagerListener containerManagerListener = new IContainerManagerListener() { public void containerAdded(IContainer container) { IChannelContainerAdapter cca = (IChannelContainerAdapter) container.getAdapter(IChannelContainerAdapter.class); if (cca == null) return; container.addListener(containerListener); } public void containerRemoved(IContainer container) { container.removeListener(containerListener); } }; /** * Called on ECF-startup, registers our IContainerManagerListener with the IContainerManager, hence we are able to * react to added/removed containers. */ @Override public IStatus run(IProgressMonitor monitor) { IContainerManager containerManager = ECFContribution.getDefault().getContainerManager(); if (containerManager == null) return new Status(IStatus.WARNING, ECFContribution.PLUGIN_ID, IStatus.WARNING, "no container manager available", null); containerManager.addListener(containerManagerListener); return Status.OK_STATUS; } }