/*******************************************************************************
* Copyright (c) 2006, 2009 Wind River Systems 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:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.ui.viewmodel.launch;
import java.util.Arrays;
import java.util.List;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.IDsfStatusConstants;
import org.eclipse.cdt.dsf.datamodel.DataModelInitializedEvent;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.cdt.dsf.ui.viewmodel.AbstractVMProvider;
import org.eclipse.cdt.dsf.ui.viewmodel.IRootVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.ModelProxyInstalledEvent;
import org.eclipse.cdt.dsf.ui.viewmodel.RootVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.VMDelta;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.model.IDebugElement;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
/**
* Layout node for the standard ILaunch object. This node can only be used at
* the root of a hierarchy. It does not implement the label provider
* functionality, so the default adapters should be used to retrieve the label.
*/
public class LaunchRootVMNode extends RootVMNode
implements IRootVMNode
{
public static class LaunchesEvent {
public enum Type { ADDED, REMOVED, CHANGED, TERMINATED }
public final ILaunch[] fLaunches;
public final Type fType;
public LaunchesEvent(ILaunch[] launches, Type type) {
fLaunches = launches;
fType = type;
}
}
public LaunchRootVMNode(AbstractVMProvider provider) {
super(provider);
}
@Override
public String toString() {
return "LaunchRootVMNode"; //$NON-NLS-1$
}
@Override
public boolean isDeltaEvent(Object rootObject, Object e) {
if (e instanceof DebugEvent) {
DebugEvent de = (DebugEvent)e;
if (de.getSource() instanceof IProcess &&
!((IProcess)de.getSource()).getLaunch().equals(rootObject) )
{
return false;
}
else if (de.getSource() instanceof IDebugElement &&
!rootObject.equals(((IDebugElement)de.getSource()).getLaunch()))
{
return false;
}
} else if (e instanceof ModelProxyInstalledEvent || e instanceof DataModelInitializedEvent) {
return true;
}
return super.isDeltaEvent(rootObject, e);
}
@Override
public int getDeltaFlags(Object e) {
int flags = 0;
if (e instanceof LaunchesEvent) {
LaunchesEvent le = (LaunchesEvent)e;
if (le.fType == LaunchesEvent.Type.CHANGED || le.fType == LaunchesEvent.Type.TERMINATED) {
flags = IModelDelta.STATE | IModelDelta.CONTENT;
}
} else if (e instanceof ModelProxyInstalledEvent || e instanceof DataModelInitializedEvent) {
flags = IModelDelta.EXPAND | IModelDelta.SELECT;
}
return flags;
}
@Override
public void createRootDelta(Object rootObject, Object event, final DataRequestMonitor<VMDelta> rm) {
if (!(rootObject instanceof ILaunch)) {
rm.setStatus(new Status(IStatus.ERROR, DsfUIPlugin.PLUGIN_ID, IDsfStatusConstants.INVALID_STATE, "Invalid root element configured with launch root node.", null)); //$NON-NLS-1$
rm.done();
return;
}
ILaunch rootLaunch = (ILaunch)rootObject;
/*
* Create the root of the delta. Since the launch object is not at the
* root of the view, create the delta with the path to the launch.
*/
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
List<ILaunch> launchList = Arrays.asList(manager.getLaunches());
final VMDelta viewRootDelta = new VMDelta(manager, 0, IModelDelta.NO_CHANGE, launchList.size());
final VMDelta rootDelta = viewRootDelta.addNode(rootLaunch, launchList.indexOf(rootLaunch), IModelDelta.NO_CHANGE);
// Generate delta for launch node.
if (event instanceof LaunchesEvent) {
LaunchesEvent le = (LaunchesEvent)event;
for (ILaunch launch : le.fLaunches) {
if (rootLaunch == launch) {
if (le.fType == LaunchesEvent.Type.CHANGED) {
rootDelta.setFlags(rootDelta.getFlags() | IModelDelta.STATE | IModelDelta.CONTENT);
} else if (le.fType == LaunchesEvent.Type.TERMINATED) {
rootDelta.setFlags(rootDelta.getFlags() | IModelDelta.STATE | IModelDelta.CONTENT);
}
}
}
} else if (event instanceof ModelProxyInstalledEvent || event instanceof DataModelInitializedEvent) {
rootDelta.setFlags(rootDelta.getFlags() | IModelDelta.EXPAND | IModelDelta.SELECT);
}
rm.setData(rootDelta);
rm.done();
}
}