/*******************************************************************************
* 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.ui.viewmodel.datamodel;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.datamodel.IDMEvent;
import org.eclipse.cdt.dsf.ui.viewmodel.AbstractVMProvider;
import org.eclipse.cdt.dsf.ui.viewmodel.IRootVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.RootVMNode;
/**
* This is is a standard root node which listens to the selection in Debug View.
* Views such as variables and registers base their content on the
* selection in Debug view, and this node provides tracking of that selection.
* <p>
* Note: The variables/registers views track the selection using the same
* IDebugContextListener interface, but they only use the first element of the
* selection, as in IStructuredSelection.getFirstElement(). Therefore the root
* node also has to use the first element as the root object instead of the
* whole selection.
*
* @since 1.0
*/
public class RootDMVMNode extends RootVMNode
implements IRootVMNode
{
public RootDMVMNode(AbstractVMProvider provider) {
super(provider);
}
@Override
public String toString() {
return "RootDMVMNode"; //$NON-NLS-1$
}
/**
* If the input object is a Data Model context, and the event is a DMC event.
* Then we can filter the event to make sure that the view does not
* react to events that relate to objects outside this view.
*
* The logic is such:
* - iterate through the full hierarchy of the DMC in the event,
* - for each DMC in event, search for a DMC of the same type in the input
* event,
* - if an ancestor of that type is found, it indicates that the event
* and the input object share the same hierarchy
* - finally compare the DMContexts from the event to the DMC from the input
* object,
* - if there is a match then we know that the event relates
* to the hierarchy in view,
* - if there is no match, then we know that the event related to a
* some sibling of the input object, and no delta should be generated,
* - if none of the ancestor types matched, then the event is completely
* unrelated to the input object, and the layout nodes in the view must
* determine whether a delta is needed.
*/
@Override
public boolean isDeltaEvent(Object rootObject, Object event) {
if (rootObject instanceof IDMVMContext) {
IDMContext inputDmc = ((IDMVMContext)rootObject).getDMContext();
if (event instanceof IDMEvent && inputDmc != null) {
boolean potentialMatchFound = false;
boolean matchFound = false;
IDMContext eventDmc = ((IDMEvent<?>)event).getDMContext();
for (IDMContext eventDmcAncestor : DMContexts.toList(eventDmc)) {
IDMContext inputDmcAncestor = DMContexts.getAncestorOfType(inputDmc, eventDmcAncestor.getClass());
if (inputDmcAncestor != null) {
potentialMatchFound = true;
if (inputDmcAncestor.equals(eventDmcAncestor)) {
return true;
}
}
}
if (potentialMatchFound && !matchFound) {
return false;
}
}
}
return true;
}
}