/*******************************************************************************
* Copyright (c) 2014 Zend Technologies 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:
* Zend Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.php.internal.debug.ui.model;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.debug.core.*;
import org.eclipse.debug.core.model.*;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
import org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler;
import org.eclipse.debug.internal.ui.viewers.update.DebugTargetProxy;
/**
* PHP multi-debug target element proxy.
*
* @author Bartlomiej Laczkowski, 2014
*/
@SuppressWarnings("restriction")
public class PHPMultiDebugTargetProxy extends DebugTargetProxy {
private IDebugTarget debugTarget;
/**
* Creates new multi+debug target proxz.
*
* @param debugTarget
*/
public PHPMultiDebugTargetProxy(IDebugTarget debugTarget) {
super(debugTarget);
this.debugTarget = debugTarget;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.debug.internal.ui.viewers.update.DebugTargetProxy#
* createEventHandlers()
*/
@Override
protected DebugEventHandler[] createEventHandlers() {
return new DebugEventHandler[] { new PHPThreadEventHandler(this) };
}
/*
* (non-Javadoc)
*
* @see org.eclipse.debug.internal.ui.viewers.update.DebugTargetProxy#
* containsEvent (org.eclipse.debug.core.DebugEvent)
*/
@Override
protected boolean containsEvent(DebugEvent event) {
Object source = event.getSource();
if (source instanceof IDebugElement) {
/*
* Get target from launch (launch has the wrapping multiple-target)
*/
ILaunch launch = ((IDebugElement) source).getLaunch();
if (launch == null)
return false;
IDebugTarget debugTarget = launch.getDebugTarget();
if (debugTarget != null) {
return debugTarget.equals(this.debugTarget);
}
}
return false;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.debug.internal.ui.viewers.update.DebugTargetProxy#
* getNextSuspendedThreadDelta(org.eclipse.debug.core.model.IThread,
* boolean)
*/
protected ModelDelta getNextSuspendedThreadDelta(IThread currentThread, boolean reverse) {
if (debugTarget != null) {
try {
IThread[] threads = debugTarget.getThreads();
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
ILaunch launch = debugTarget.getLaunch();
int launchIndex = indexOf(manager.getLaunches(), debugTarget.getLaunch());
int targetIndex = indexOf(debugTarget.getLaunch().getChildren(), debugTarget);
List<IThread> chosen = new ArrayList<IThread>();
// Select & unfold all suspended threads
boolean takeNext = currentThread == null;
int startIdx = reverse ? threads.length - 1 : 0;
int endIdx = reverse ? -1 : threads.length;
int increment = reverse ? -1 : 1;
for (int i = startIdx; i != endIdx; i = i + increment) {
IThread thread = threads[i];
if (thread.isSuspended()) {
IBreakpoint[] bps = thread.getBreakpoints();
if (bps != null && bps.length > 0) {
chosen.add(thread);
} else if (thread.isSuspended()) {
chosen.add(thread);
}
}
takeNext = takeNext || thread.equals(currentThread);
}
if (!chosen.isEmpty()) {
ModelDelta delta = new ModelDelta(manager, IModelDelta.NO_CHANGE);
ModelDelta node = delta.addNode(launch, launchIndex, IModelDelta.NO_CHANGE,
debugTarget.getLaunch().getChildren().length);
node = node.addNode(debugTarget, targetIndex, IModelDelta.NO_CHANGE, threads.length);
for (int i = 0; i < chosen.size(); i++) {
IThread t = chosen.get(i);
IStackFrame frame = t.getTopStackFrame();
if (frame != null) {
ModelDelta next = node.addNode(t, i, IModelDelta.NO_CHANGE | IModelDelta.EXPAND,
t.getStackFrames().length);
next = next.addNode(frame, 0, IModelDelta.NO_CHANGE | IModelDelta.SELECT, 0);
}
}
return delta;
}
} catch (DebugException e) {
}
}
return null;
}
}