1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

[306007] [expressions][hover] Modifying a value in the hover does not show right away in the hover

This commit is contained in:
Anton Leherbauer 2010-03-26 08:42:44 +00:00
parent f4e45adcea
commit ea688d344d
4 changed files with 96 additions and 42 deletions

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2008, 2009 IBM Corporation and others. * Copyright (c) 2008, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -18,7 +18,6 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.model.IVariable; import org.eclipse.debug.core.model.IVariable;
import org.eclipse.debug.internal.ui.SWTFactory; import org.eclipse.debug.internal.ui.SWTFactory;
import org.eclipse.debug.internal.ui.model.elements.ElementContentProvider; import org.eclipse.debug.internal.ui.model.elements.ElementContentProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IChildrenUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputRequestor; import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputRequestor;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputUpdate; import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerInputUpdate;
@ -67,6 +66,35 @@ import org.eclipse.ui.IWorkbenchPartSite;
@SuppressWarnings("restriction") @SuppressWarnings("restriction")
public class ExpressionInformationControlCreator implements IInformationControlCreator { public class ExpressionInformationControlCreator implements IInformationControlCreator {
/**
* A presentation context for the expression hover control.
* Implements equals and hashCode based on id comparison.
*/
private static final class ExpressionHoverPresentationContext extends PresentationContext {
private ExpressionHoverPresentationContext(String id) {
super(id);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof ExpressionHoverPresentationContext) {
if (getId().equals(((PresentationContext) obj).getId())) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
return getId().hashCode();
}
}
class ExpressionInformationControl extends AbstractInformationControl implements IInformationControlExtension2, IViewerInputRequestor { class ExpressionInformationControl extends AbstractInformationControl implements IInformationControlExtension2, IViewerInputRequestor {
/** /**
@ -268,7 +296,7 @@ public class ExpressionInformationControlCreator implements IInformationControlC
// update presentation context // update presentation context
AbstractDebugView view = getViewToEmulate(); AbstractDebugView view = getViewToEmulate();
IPresentationContext context = new PresentationContext(IDsfDebugUIConstants.ID_EXPRESSION_HOVER); IPresentationContext context = new ExpressionHoverPresentationContext(IDsfDebugUIConstants.ID_EXPRESSION_HOVER);
if (view != null) { if (view != null) {
// copy over properties // copy over properties
IPresentationContext copy = ((TreeModelViewer)view.getViewer()).getPresentationContext(); IPresentationContext copy = ((TreeModelViewer)view.getViewer()).getPresentationContext();
@ -283,7 +311,7 @@ public class ExpressionInformationControlCreator implements IInformationControlC
} }
} }
fViewer = new TreeModelViewer(fSashForm, SWT.NO_TRIM | SWT.MULTI | SWT.VIRTUAL, context); fViewer = new TreeModelViewer(fSashForm, SWT.MULTI | SWT.VIRTUAL | SWT.FULL_SELECTION, context);
fViewer.setAutoExpandLevel(1); fViewer.setAutoExpandLevel(1);
if (view != null) { if (view != null) {
@ -322,21 +350,21 @@ public class ExpressionInformationControlCreator implements IInformationControlC
// add update listener to auto-select and display details of root expression // add update listener to auto-select and display details of root expression
fViewer.addViewerUpdateListener(new IViewerUpdateListener() { fViewer.addViewerUpdateListener(new IViewerUpdateListener() {
public void viewerUpdatesComplete() { public void viewerUpdatesComplete() {
fViewer.getDisplay().timerExec(100, new Runnable() {
public void run() {
TreeSelection selection = (TreeSelection) fViewer.getSelection();
if (selection.isEmpty()) {
selection = new TreeSelection(fViewer.getTopElementPath());
}
fViewer.setSelection(selection);
fDetailPane.display(selection);
}});
} }
public void viewerUpdatesBegin() { public void viewerUpdatesBegin() {
} }
public void updateStarted(IViewerUpdate update) { public void updateStarted(IViewerUpdate update) {
} }
public void updateComplete(IViewerUpdate update) { public void updateComplete(IViewerUpdate update) {
if (update instanceof IChildrenUpdate) {
fViewer.removeViewerUpdateListener(this);
fViewer.getDisplay().timerExec(100, new Runnable() {
public void run() {
TreeSelection selection = new TreeSelection(fViewer.getTopElementPath());
fViewer.setSelection(selection);
fDetailPane.display(selection);
}});
}
} }
}); });

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2009 IBM Corporation and others. * Copyright (c) 2006, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -27,6 +27,7 @@ import org.eclipse.cdt.dsf.debug.internal.ui.viewmodel.detailsupport.DetailPaneM
import org.eclipse.cdt.dsf.debug.internal.ui.viewmodel.detailsupport.DetailPaneWordWrapAction; import org.eclipse.cdt.dsf.debug.internal.ui.viewmodel.detailsupport.DetailPaneWordWrapAction;
import org.eclipse.cdt.dsf.debug.internal.ui.viewmodel.detailsupport.MessagesForDetailPane; import org.eclipse.cdt.dsf.debug.internal.ui.viewmodel.detailsupport.MessagesForDetailPane;
import org.eclipse.cdt.dsf.debug.internal.ui.viewmodel.detailsupport.TextViewerAction; import org.eclipse.cdt.dsf.debug.internal.ui.viewmodel.detailsupport.TextViewerAction;
import org.eclipse.cdt.dsf.debug.ui.IDsfDebugUIConstants;
import org.eclipse.cdt.dsf.debug.ui.viewmodel.IDebugVMConstants; import org.eclipse.cdt.dsf.debug.ui.viewmodel.IDebugVMConstants;
import org.eclipse.cdt.dsf.debug.ui.viewmodel.numberformat.FormattedValueVMUtil; import org.eclipse.cdt.dsf.debug.ui.viewmodel.numberformat.FormattedValueVMUtil;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin; import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
@ -630,9 +631,14 @@ public class NumberFormatDetailPane implements IDetailPane2, IAdaptable, IProper
} else if (firstElement instanceof IDMVMContext) { } else if (firstElement instanceof IDMVMContext) {
IVMNode vmNode = ((IDMVMContext) firstElement).getVMNode(); IVMNode vmNode = ((IDMVMContext) firstElement).getVMNode();
if (vmNode != null) { if (vmNode != null) {
Object input = firstElement;
IVMProvider vmProvider = vmNode.getVMProvider(); IVMProvider vmProvider = vmNode.getVMProvider();
fDetailJob = new DetailJob(vmProvider.getPresentationContext(), firstElement, final IPresentationContext context= vmProvider.getPresentationContext();
(ITreeSelection)selection, null); if (IDsfDebugUIConstants.ID_EXPRESSION_HOVER.equals(context.getId())) {
// magic access to viewer input - see ExpressionVMProvider
input = context.getProperty("__viewerInput"); //$NON-NLS-1$
}
fDetailJob = new DetailJob(context, input, (ITreeSelection)selection, null);
fDetailJob.schedule(); fDetailJob.schedule();
} }
} }
@ -694,7 +700,7 @@ public class NumberFormatDetailPane implements IDetailPane2, IAdaptable, IProper
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("rawtypes")
public Object getAdapter(Class required) { public Object getAdapter(Class required) {
if (IFindReplaceTarget.class.equals(required)) { if (IFindReplaceTarget.class.equals(required)) {
return fTextViewer.getFindReplaceTarget(); return fTextViewer.getFindReplaceTarget();

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2009 Wind River Systems and others. * Copyright (c) 2006, 2010 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -11,6 +11,7 @@
package org.eclipse.cdt.dsf.debug.ui.viewmodel.expression; package org.eclipse.cdt.dsf.debug.ui.viewmodel.expression;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.RejectedExecutionException;
@ -41,6 +42,7 @@ import org.eclipse.cdt.dsf.ui.viewmodel.IVMModelProxy;
import org.eclipse.cdt.dsf.ui.viewmodel.IVMNode; import org.eclipse.cdt.dsf.ui.viewmodel.IVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.VMDelta; import org.eclipse.cdt.dsf.ui.viewmodel.VMDelta;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.AbstractDMVMProvider; import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.AbstractDMVMProvider;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.RootDMVMNode; import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.RootDMVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.update.AutomaticUpdatePolicy; import org.eclipse.cdt.dsf.ui.viewmodel.update.AutomaticUpdatePolicy;
import org.eclipse.cdt.dsf.ui.viewmodel.update.IVMUpdatePolicy; import org.eclipse.cdt.dsf.ui.viewmodel.update.IVMUpdatePolicy;
@ -143,8 +145,10 @@ public class ExpressionVMProvider extends AbstractDMVMProvider
*/ */
public int getDeltaFlagsForExpression(IExpression expression, Object event) { public int getDeltaFlagsForExpression(IExpression expression, Object event) {
// Workaround: find the first active proxy and use it. // Workaround: find the first active proxy and use it.
if (!getActiveModelProxies().isEmpty()) { final List<IVMModelProxy> activeModelProxies= getActiveModelProxies();
return ((ExpressionVMProviderModelProxyStrategy)getActiveModelProxies().get(0)).getDeltaFlagsForExpression(expression, event); int count = activeModelProxies.size();
if (count > 0) {
return ((ExpressionVMProviderModelProxyStrategy)activeModelProxies.get(count - 1)).getDeltaFlagsForExpression(expression, event);
} }
return 0; return 0;
} }
@ -397,7 +401,12 @@ public class ExpressionVMProvider extends AbstractDMVMProvider
IExpressionDMContext dmc = (IExpressionDMContext) input; IExpressionDMContext dmc = (IExpressionDMContext) input;
SingleExpressionVMNode vmNode = (SingleExpressionVMNode) getChildVMNodes(getRootVMNode())[0]; SingleExpressionVMNode vmNode = (SingleExpressionVMNode) getChildVMNodes(getRootVMNode())[0];
vmNode.setExpression(dmc); vmNode.setExpression(dmc);
update.setInputElement(vmNode.createVMContext(dmc)); final IDMVMContext viewerInput= vmNode.createVMContext(dmc);
// provide access to viewer (needed by details pane)
getPresentationContext().setProperty("__viewerInput", viewerInput); //$NON-NLS-1$
update.setInputElement(viewerInput);
update.done(); update.done();
return; return;
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2009 Wind River Systems, Inc. and others. * Copyright (c) 2009, 2010 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -24,9 +24,9 @@ import org.eclipse.cdt.dsf.debug.ui.viewmodel.expression.ExpressionsChangedEvent
import org.eclipse.cdt.dsf.debug.ui.viewmodel.expression.InvalidExpressionVMContext; import org.eclipse.cdt.dsf.debug.ui.viewmodel.expression.InvalidExpressionVMContext;
import org.eclipse.cdt.dsf.ui.concurrent.ViewerCountingRequestMonitor; import org.eclipse.cdt.dsf.ui.concurrent.ViewerCountingRequestMonitor;
import org.eclipse.cdt.dsf.ui.viewmodel.AbstractVMContext; import org.eclipse.cdt.dsf.ui.viewmodel.AbstractVMContext;
import org.eclipse.cdt.dsf.ui.viewmodel.AbstractVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.IVMNode; import org.eclipse.cdt.dsf.ui.viewmodel.IVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.VMDelta; import org.eclipse.cdt.dsf.ui.viewmodel.VMDelta;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.AbstractDMVMNode;
import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext; import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext;
import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IDebugTarget;
@ -42,8 +42,10 @@ import org.eclipse.jface.viewers.TreePath;
/** /**
* A VM node for displaying a single expression in the expression hover. * A VM node for displaying a single expression in the expression hover.
*
* @since 2.1
*/ */
public class SingleExpressionVMNode extends AbstractDMVMNode implements IElementLabelProvider { public class SingleExpressionVMNode extends AbstractVMNode implements IElementLabelProvider {
private static class RootDMVMContext extends AbstractVMContext implements IDMVMContext { private static class RootDMVMContext extends AbstractVMContext implements IDMVMContext {
private final IDMContext fDmc; private final IDMContext fDmc;
@ -72,10 +74,14 @@ public class SingleExpressionVMNode extends AbstractDMVMNode implements IElement
@Override @Override
public boolean equals(Object other) { public boolean equals(Object other) {
if (!(other instanceof RootDMVMContext)) return false; if (this == other) {
return true;
}
if (other instanceof RootDMVMContext) {
RootDMVMContext otherVmc = (RootDMVMContext)other; RootDMVMContext otherVmc = (RootDMVMContext)other;
return getVMNode().equals(otherVmc.getVMNode()) && return getVMNode().equals(otherVmc.getVMNode()) && fDmc.equals(otherVmc.fDmc);
fDmc.equals(otherVmc.fDmc); }
return false;
} }
@Override @Override
@ -111,7 +117,20 @@ public class SingleExpressionVMNode extends AbstractDMVMNode implements IElement
public Object getAdapter(Class adapter) { public Object getAdapter(Class adapter) {
return null; return null;
} }
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof SimpleExpression) {
return fExpressionText.equals(((SimpleExpression) obj).getExpressionText());
}
return false;
}
@Override
public int hashCode() {
return fExpressionText.hashCode();
}
} }
private static class SingleExpressionManager { private static class SingleExpressionManager {
@ -133,7 +152,7 @@ public class SingleExpressionVMNode extends AbstractDMVMNode implements IElement
private final SingleExpressionManager fManager; private final SingleExpressionManager fManager;
public SingleExpressionVMNode(ExpressionVMProvider provider) { public SingleExpressionVMNode(ExpressionVMProvider provider) {
super(provider, provider.getSession(), IExpressionDMContext.class); super(provider);
fManager = new SingleExpressionManager(); fManager = new SingleExpressionManager();
} }
@ -146,7 +165,6 @@ public class SingleExpressionVMNode extends AbstractDMVMNode implements IElement
return (ExpressionVMProvider)getVMProvider(); return (ExpressionVMProvider)getVMProvider();
} }
@Override
public void update(IHasChildrenUpdate[] updates) { public void update(IHasChildrenUpdate[] updates) {
// Test availability of children based on whether there are any expressions // Test availability of children based on whether there are any expressions
// in the manager. We assume that the getExpressions() will just read // in the manager. We assume that the getExpressions() will just read
@ -158,7 +176,6 @@ public class SingleExpressionVMNode extends AbstractDMVMNode implements IElement
} }
} }
@Override
public void update(IChildrenCountUpdate[] updates) { public void update(IChildrenCountUpdate[] updates) {
for (IChildrenCountUpdate update : updates) { for (IChildrenCountUpdate update : updates) {
if (!checkUpdate(update)) continue; if (!checkUpdate(update)) continue;
@ -170,7 +187,6 @@ public class SingleExpressionVMNode extends AbstractDMVMNode implements IElement
} }
} }
@Override
public void update(final IChildrenUpdate[] updates) { public void update(final IChildrenUpdate[] updates) {
for (IChildrenUpdate update : updates) { for (IChildrenUpdate update : updates) {
doUpdateChildren(update); doUpdateChildren(update);
@ -310,19 +326,14 @@ public class SingleExpressionVMNode extends AbstractDMVMNode implements IElement
return new TreePath(elementList.toArray()); return new TreePath(elementList.toArray());
} }
@Override
protected void updateElementsInSessionThread(IChildrenUpdate update) { protected void updateElementsInSessionThread(IChildrenUpdate update) {
doUpdateChildren(update); doUpdateChildren(update);
} }
@Override
public IDMVMContext createVMContext(IDMContext dmc) { public IDMVMContext createVMContext(IDMContext dmc) {
return new RootDMVMContext(getVMProvider().getRootVMNode(), dmc); return new RootDMVMContext(getVMProvider().getRootVMNode(), dmc);
} }
/**
* @since 2.1
*/
public void setExpression(IExpressionDMContext dmc) { public void setExpression(IExpressionDMContext dmc) {
String text = dmc.getExpression(); String text = dmc.getExpression();
fManager.setExpression(new SimpleExpression(text)); fManager.setExpression(new SimpleExpression(text));