/*******************************************************************************
* Copyright (c) 2004, 2011 QNX Software 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:
* QNX Software Systems - Initial API and implementation
* Wind River Systems - flexible hierarchy Signals view (bug 338908)
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.views.signals;
import org.eclipse.cdt.debug.core.model.ICSignal;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.model.IDebugTarget;
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.provisional.AbstractModelProxy;
import org.eclipse.debug.internal.ui.viewers.update.DebugEventHandler;
/**
*/
public class FlexibleSignalsViewEventHandler extends DebugEventHandler {
private Object fTarget;
/**
* Constructor for SignalsViewEventHandler.
*/
public FlexibleSignalsViewEventHandler( AbstractModelProxy proxy, Object target ) {
super( proxy );
fTarget = target;
}
@Override
protected boolean handlesEvent( DebugEvent event ) {
int kind = event.getKind();
if ( kind == DebugEvent.CREATE ||
kind == DebugEvent.TERMINATE ||
kind == DebugEvent.CHANGE ||
kind == DebugEvent.SUSPEND)
return true;
return false;
}
@Override
protected void handleChange( DebugEvent event ) {
if ( event.getSource() instanceof ICSignal )
fireDelta( (ICSignal)event.getSource(), IModelDelta.STATE );
}
@Override
protected void handleCreate( DebugEvent event ) {
Object source = event.getSource();
if ( source instanceof IDebugTarget ) {
refreshRoot( event );
}
else if ( source instanceof ICSignal ) {
if ( accept( (ICSignal)source ) ) {
ICSignal signal = (ICSignal)source;
fireDelta( signal, IModelDelta.ADDED );
}
}
}
@Override
protected void handleTerminate( DebugEvent event ) {
Object source = event.getSource();
if ( source instanceof IDebugTarget ) {
refreshRoot( event );
}
else if ( source instanceof ICSignal ) {
fireDelta( (ICSignal)source, IModelDelta.REMOVED );
}
}
private void fireDelta( ICSignal signal, int flags ) {
ModelDelta root = new ModelDelta( fTarget, IModelDelta.NO_CHANGE );
root.addNode( signal, flags );
fireDelta( root );
}
@Override
public synchronized void dispose() {
super.dispose();
fTarget = null;
}
private boolean accept( ICSignal signal ) {
return fTarget.equals( signal.getDebugTarget() );
}
}