/******************************************************************************* * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * 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 *******************************************************************************/ package gov.redhawk.ide.debug.internal.ui; import gov.redhawk.ide.debug.LocalSca; import gov.redhawk.ide.debug.LocalScaDeviceManager; import gov.redhawk.ide.debug.LocalScaWaveform; import gov.redhawk.ide.debug.ScaDebugPackage; import gov.redhawk.ide.debug.ScaDebugPlugin; import gov.redhawk.model.sca.ScaDomainManagerRegistry; import gov.redhawk.model.sca.commands.ScaModelCommand; import gov.redhawk.model.sca.provider.ScaItemProviderAdapterFactory; import gov.redhawk.sca.ui.ScaContentProvider; import java.util.Collection; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.ecore.impl.EStructuralFeatureImpl.BasicFeatureMapEntry; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.jface.viewers.TreeViewer; /** * */ public class ScaDebugContentProvider extends ScaContentProvider { private static final Object[] EMPTY_OBJECTS = new Object[0]; private boolean disposed = false; private Adapter listener = new AdapterImpl() { @Override public void notifyChanged(org.eclipse.emf.common.notify.Notification msg) { if (disposed) { if (msg.getNotifier() instanceof Notifier) { ((Notifier) msg.getNotifier()).eAdapters().remove(this); return; } } super.notifyChanged(msg); if (msg.getNotifier() instanceof LocalScaWaveform) { switch (msg.getFeatureID(LocalScaWaveform.class)) { case ScaDebugPackage.LOCAL_SCA_WAVEFORM__COMPONENTS: reveal(msg.getNewValue()); break; default: break; } } else if (msg.getNotifier() instanceof LocalSca) { switch (msg.getFeatureID(LocalSca.class)) { case ScaDebugPackage.LOCAL_SCA__WAVEFORMS: reveal(msg.getNewValue()); break; case ScaDebugPackage.LOCAL_SCA__SANDBOX_WAVEFORM: if (msg.getNewValue() instanceof LocalScaWaveform) { ((LocalScaWaveform) msg.getNewValue()).eAdapters().add(this); } if (msg.getOldValue() instanceof LocalScaWaveform) { ((LocalScaWaveform) msg.getOldValue()).eAdapters().remove(this); } break; case ScaDebugPackage.LOCAL_SCA__SANDBOX_DEVICE_MANAGER: if (msg.getNewValue() instanceof LocalScaDeviceManager) { ((LocalScaDeviceManager) msg.getNewValue()).eAdapters().add(this); } if (msg.getOldValue() instanceof LocalScaDeviceManager) { ((LocalScaDeviceManager) msg.getOldValue()).eAdapters().remove(this); } break; default: break; } } else if (msg.getNotifier() instanceof LocalScaDeviceManager) { switch (msg.getFeatureID(LocalScaDeviceManager.class)) { case ScaDebugPackage.LOCAL_SCA_DEVICE_MANAGER__DEVICES: case ScaDebugPackage.LOCAL_SCA_DEVICE_MANAGER__SERVICES: reveal(msg.getNewValue()); break; default: break; } } } private void reveal(final Object obj) { if (obj instanceof BasicFeatureMapEntry) { BasicFeatureMapEntry entry = (BasicFeatureMapEntry) obj; reveal(entry.getValue()); } else if (obj == null) { return; } else if (viewer != null && !viewer.getControl().isDisposed()) { viewer.getControl().getDisplay().asyncExec(new Runnable() { @Override public void run() { if (viewer == null) { return; } if (obj instanceof Collection< ? >) { for (Object o : ((Collection< ? >) obj)) { ((TreeViewer) viewer).reveal(o); } } else { ((TreeViewer) viewer).reveal(obj); } } }); } } }; public ScaDebugContentProvider() { super(ScaDebugContentProvider.createAdapterFactory()); final ScaDebugPlugin activator = ScaDebugPlugin.getInstance(); final LocalSca localSca = activator.getLocalSca(); ScaModelCommand.execute(localSca, new ScaModelCommand() { @Override public void execute() { localSca.eAdapters().add(listener); if (localSca.getSandboxWaveform() != null) { localSca.getSandboxWaveform().eAdapters().add(listener); } if (localSca.getSandboxDeviceManager() != null) { localSca.getSandboxDeviceManager().eAdapters().add(listener); } } }); } @Override public void dispose() { if (disposed) { return; } disposed = true; final ScaDebugPlugin activator = ScaDebugPlugin.getInstance(); final LocalSca localSca = activator.getLocalSca(); ScaModelCommand.execute(localSca, new ScaModelCommand() { @Override public void execute() { localSca.eAdapters().remove(listener); if (localSca.getSandboxWaveform() != null) { localSca.getSandboxWaveform().eAdapters().remove(listener); } if (localSca.getSandboxDeviceManager() != null) { localSca.getSandboxDeviceManager().eAdapters().remove(listener); } } }); super.dispose(); } protected static AdapterFactory createAdapterFactory() { final ComposedAdapterFactory factory = new ComposedAdapterFactory(); factory.addAdapterFactory(new ScaItemProviderAdapterFactory()); factory.addAdapterFactory(ScaContentProvider.createAdapterFactory()); return factory; } @Override public Object[] getElements(final Object object) { final ScaDebugPlugin activator = ScaDebugPlugin.getInstance(); if (activator == null) { return EMPTY_OBJECTS; } if (object instanceof IWorkspaceRoot) { return new Object[] { activator.getLocalSca() }; } else if (object instanceof ScaDomainManagerRegistry) { return new Object[] { activator.getLocalSca() }; } else { return EMPTY_OBJECTS; } } }