diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java index 46db0162f08..fb9acb9c39c 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/expression/ExpressionManagerVMNode.java @@ -73,7 +73,7 @@ public class ExpressionManagerVMNode extends AbstractVMNode final private IExpression fExpression; public InvalidExpressionVMContext(ExpressionManagerVMNode node, IExpression expression) { - super(node.getVMProvider().getVMAdapter(), node); + super(node); fExpression = expression; } @@ -108,7 +108,7 @@ public class ExpressionManagerVMNode extends AbstractVMNode */ class NewExpressionVMC extends AbstractVMContext { public NewExpressionVMC() { - super(getVMProvider().getVMAdapter(), ExpressionManagerVMNode.this); + super(ExpressionManagerVMNode.this); } @Override diff --git a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/StandardProcessVMNode.java b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/StandardProcessVMNode.java index 318b12601a7..86591b2eec5 100644 --- a/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/StandardProcessVMNode.java +++ b/plugins/org.eclipse.dd.dsf.debug.ui/src/org/eclipse/dd/dsf/debug/internal/provisional/ui/viewmodel/launch/StandardProcessVMNode.java @@ -49,7 +49,7 @@ public class StandardProcessVMNode extends AbstractVMNode { private final IProcess fProcess; VMC(IProcess process) { - super(getVMProvider().getVMAdapter(), StandardProcessVMNode.this); + super(StandardProcessVMNode.this); fProcess = process; } diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/AbstractVMContext.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/AbstractVMContext.java index 5fab2eb44d7..60a5810c604 100644 --- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/AbstractVMContext.java +++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/AbstractVMContext.java @@ -1,50 +1,51 @@ package org.eclipse.dd.dsf.ui.viewmodel; -import org.eclipse.dd.dsf.ui.viewmodel.properties.IElementPropertiesProvider; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IColumnPresentationFactory; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementContentProvider; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider; -import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory; +import org.eclipse.core.runtime.Platform; /** - * Implementation of basic view model context interface. The main - * purpose of the VMC wrapper is to re-direct adapter queries to the IVMAdapter - * and the layout node that the given context was created by. - *
+ * Implementation of basic view model context interface. + *The main purpose of the VMC wrapper is to re-direct adapter + * queries. The redirecting of adapter queries follows this order: + *
* Note: Deriving classes must override the Object.equals/hashCode methods. * This is because the view model context objects are just wrappers that are * created by the view model on demand, so the equals methods must use the * object being wrapped to perform a meaningful comparison. */ -@SuppressWarnings("restriction") abstract public class AbstractVMContext implements IVMContext { - protected final IVMAdapter fVMAdapter; protected final IVMNode fNode; - public AbstractVMContext(IVMAdapter adapter, IVMNode node) { - fVMAdapter = adapter; + public AbstractVMContext(IVMNode node) { fNode = node; } public IVMNode getVMNode() { return fNode; } - /** - * IAdapter implementation returns the {@link IVMAdapter} instance for - * the interfaces that are actually implemented by the VM Adapter. - * These should at least include {@link IElementContentProvider}, - * {@link IModelProxyFactory}, and {@link IColumnPresentationFactory}. - * It also returns the {@link IVMNode} instance for adapters implemented - * by the context's node. The interfaces typically implemented by the - * node include {@link IElementLabelProvider} and {@link IElementPropertiesProvider}. - */ @SuppressWarnings("unchecked") public Object getAdapter(Class adapter) { - if (adapter.isInstance(fVMAdapter)) { - return fVMAdapter; - } else if (adapter.isInstance(fNode)) { - return fNode; + // If the context implements the given adapter directly, it always takes + // precedence. + if (adapter.isInstance(this)) { + return this; } - return null; + + IVMProvider vmProvider = getVMNode().getVMProvider(); + IVMAdapter vmAdapter = vmProvider.getVMAdapter(); + if (adapter.isInstance(vmAdapter)) { + return vmAdapter; + } else if (adapter.isInstance(vmProvider)) { + return vmProvider; + } else if (adapter.isInstance(getVMNode())) { + return getVMNode(); + } + return Platform.getAdapterManager().getAdapter(this, adapter); } /** Deriving classes must override. */ diff --git a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/datamodel/AbstractDMVMNode.java b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/datamodel/AbstractDMVMNode.java index 21ff0b60ac8..9b2c040bfb4 100644 --- a/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/datamodel/AbstractDMVMNode.java +++ b/plugins/org.eclipse.dd.dsf.ui/src/org/eclipse/dd/dsf/ui/viewmodel/datamodel/AbstractDMVMNode.java @@ -57,7 +57,7 @@ abstract public class AbstractDMVMNode extends AbstractVMNode implements IVMNode private final IDMContext fDmc; public DMVMContext(IDMContext dmc) { - super(getVMProvider().getVMAdapter(), AbstractDMVMNode.this); + super(AbstractDMVMNode.this); fDmc = dmc; } @@ -73,10 +73,13 @@ abstract public class AbstractDMVMNode extends AbstractVMNode implements IVMNode Object superAdapter = super.getAdapter(adapter); if (superAdapter != null) { return superAdapter; - } else if (adapter.isInstance(fDmc)) { - return fDmc; } else { - return fDmc.getAdapter(adapter); + // Delegate to the Data Model to find the context. + if (adapter.isInstance(fDmc)) { + return fDmc; + } else { + return fDmc.getAdapter(adapter); + } } } diff --git a/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FileVMContext.java b/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FileVMContext.java index 989038cdfeb..ab342c2253b 100644 --- a/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FileVMContext.java +++ b/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FileVMContext.java @@ -13,13 +13,12 @@ package org.eclipse.dd.examples.dsf.filebrowser; import java.io.File; import org.eclipse.dd.dsf.ui.viewmodel.AbstractVMContext; -import org.eclipse.dd.dsf.ui.viewmodel.IVMAdapter; import org.eclipse.dd.dsf.ui.viewmodel.IVMNode; class FileVMContext extends AbstractVMContext { private File fFile; - FileVMContext(IVMAdapter adapter, IVMNode layoutNode, File file) { - super(adapter, layoutNode); + FileVMContext(IVMNode layoutNode, File file) { + super(layoutNode); fFile = file; } diff --git a/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FileVMNode.java b/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FileVMNode.java index 1d40f990503..6e2c903327d 100644 --- a/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FileVMNode.java +++ b/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FileVMNode.java @@ -135,7 +135,7 @@ class FileVMNode int offset = update.getOffset() != -1 ? update.getOffset() : 0; int length = update.getLength() != -1 ? update.getLength() : files.length; for (int i = offset; (i < files.length) && (i < (offset + length)); i++) { - update.setChild(new FileVMContext(fProvider.getVMAdapter(), FileVMNode.this, files[i]), i); + update.setChild(new FileVMContext(FileVMNode.this, files[i]), i); } update.done(); } @@ -260,7 +260,7 @@ class FileVMNode File[] pathSegmentDirectoryFiles = pathSegment.listFiles(); delta = delta.addNode( - new FileVMContext(fProvider.getVMAdapter(), FileVMNode.this, pathSegment), + new FileVMContext(FileVMNode.this, pathSegment), nodeOffset + Arrays.asList(allFilesInDirectory).indexOf(pathSegment), IModelDelta.NO_CHANGE, pathSegmentDirectoryFiles != null ? pathSegmentDirectoryFiles.length : 0); diff --git a/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FilesystemRootsVMNode.java b/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FilesystemRootsVMNode.java index 3e64684267f..9d0445b952d 100644 --- a/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FilesystemRootsVMNode.java +++ b/plugins/org.eclipse.dd.examples.dsf/src/org/eclipse/dd/examples/dsf/filebrowser/FilesystemRootsVMNode.java @@ -56,7 +56,7 @@ class FilesystemRootsVMNode extends AbstractVMNode int offset = update.getOffset() != -1 ? update.getOffset() : 0; int length = update.getLength() != -1 ? update.getLength() : files.length; for (int i = offset; (i < files.length) && (i < (offset + length)); i++) { - update.setChild(new FileVMContext(getVMProvider().getVMAdapter(), FilesystemRootsVMNode.this, files[i]), i); + update.setChild(new FileVMContext(FilesystemRootsVMNode.this, files[i]), i); } update.done(); } @@ -168,7 +168,7 @@ class FilesystemRootsVMNode extends AbstractVMNode // Check if the specified file is not one of the roots. if (index < roots.length) { ModelDelta delta = parentDelta.addNode( - new FileVMContext(getVMProvider().getVMAdapter(), FilesystemRootsVMNode.this, eventRoot), + new FileVMContext(FilesystemRootsVMNode.this, eventRoot), index, IModelDelta.NO_CHANGE); if (eventFile.equals(eventRoot)) {