mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-27 10:55:33 +02:00
[214956] [Memory View] Memory View workflow enhancements: quick address navigation; simplified use defaults; fewer clicks
This commit is contained in:
parent
21661960b4
commit
351ab621de
1 changed files with 171 additions and 87 deletions
|
@ -17,15 +17,12 @@ import java.math.BigInteger;
|
||||||
import org.eclipse.debug.core.DebugException;
|
import org.eclipse.debug.core.DebugException;
|
||||||
import org.eclipse.debug.core.model.IMemoryBlock;
|
import org.eclipse.debug.core.model.IMemoryBlock;
|
||||||
import org.eclipse.debug.core.model.IMemoryBlockExtension;
|
import org.eclipse.debug.core.model.IMemoryBlockExtension;
|
||||||
import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
|
|
||||||
import org.eclipse.debug.core.model.IMemoryBlockRetrievalExtension;
|
import org.eclipse.debug.core.model.IMemoryBlockRetrievalExtension;
|
||||||
import org.eclipse.debug.internal.ui.DebugUIMessages;
|
import org.eclipse.debug.internal.ui.DebugUIMessages;
|
||||||
|
import org.eclipse.debug.internal.ui.DebugUIPlugin;
|
||||||
import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
|
import org.eclipse.debug.internal.ui.views.memory.MemoryViewUtil;
|
||||||
import org.eclipse.debug.internal.ui.views.memory.RenderingViewPane;
|
import org.eclipse.debug.internal.ui.views.memory.RenderingViewPane;
|
||||||
import org.eclipse.debug.internal.ui.views.memory.renderings.CreateRendering;
|
import org.eclipse.debug.internal.ui.views.memory.renderings.CreateRendering;
|
||||||
import org.eclipse.debug.internal.ui.views.memory.renderings.GoToAddressComposite;
|
|
||||||
import org.eclipse.debug.ui.DebugUITools;
|
|
||||||
import org.eclipse.debug.ui.IDebugUIConstants;
|
|
||||||
import org.eclipse.debug.ui.memory.AbstractMemoryRendering;
|
import org.eclipse.debug.ui.memory.AbstractMemoryRendering;
|
||||||
import org.eclipse.debug.ui.memory.IMemoryRendering;
|
import org.eclipse.debug.ui.memory.IMemoryRendering;
|
||||||
import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
|
import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
|
||||||
|
@ -37,10 +34,14 @@ import org.eclipse.swt.events.KeyAdapter;
|
||||||
import org.eclipse.swt.events.KeyEvent;
|
import org.eclipse.swt.events.KeyEvent;
|
||||||
import org.eclipse.swt.events.SelectionAdapter;
|
import org.eclipse.swt.events.SelectionAdapter;
|
||||||
import org.eclipse.swt.events.SelectionEvent;
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
import org.eclipse.swt.widgets.Button;
|
import org.eclipse.swt.widgets.Button;
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
import org.eclipse.swt.widgets.Control;
|
import org.eclipse.swt.widgets.Control;
|
||||||
import org.eclipse.swt.widgets.Display;
|
import org.eclipse.swt.widgets.Display;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
|
||||||
public class TraditionalGoToAddressRendering extends AbstractMemoryRendering {
|
public class TraditionalGoToAddressRendering extends AbstractMemoryRendering {
|
||||||
|
|
||||||
|
@ -64,7 +65,7 @@ public class TraditionalGoToAddressRendering extends AbstractMemoryRendering {
|
||||||
|
|
||||||
Composite fGotoAddressContainer = parent;
|
Composite fGotoAddressContainer = parent;
|
||||||
|
|
||||||
final GoToAddressComposite fGotoAddress = new GoToAddressComposite();
|
final GoToAddressWidget fGotoAddress = new GoToAddressWidget();
|
||||||
Control fGotoAddressControl = fGotoAddress.createControl(fGotoAddressContainer);
|
Control fGotoAddressControl = fGotoAddress.createControl(fGotoAddressContainer);
|
||||||
|
|
||||||
fControl = fGotoAddressControl;
|
fControl = fGotoAddressControl;
|
||||||
|
@ -73,87 +74,7 @@ public class TraditionalGoToAddressRendering extends AbstractMemoryRendering {
|
||||||
{
|
{
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
String expression = fGotoAddress.getExpressionText();
|
go(fGotoAddress.getExpressionText(), false);
|
||||||
int radix = 10;
|
|
||||||
if(expression.toUpperCase().startsWith("0X"))
|
|
||||||
{
|
|
||||||
expression = expression.substring(2);
|
|
||||||
radix = 16;
|
|
||||||
}
|
|
||||||
else if(fGotoAddress.isHex())
|
|
||||||
{
|
|
||||||
radix = 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
BigInteger address = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
address = new BigInteger(expression, radix);
|
|
||||||
}
|
|
||||||
catch(NumberFormatException nfe)
|
|
||||||
{
|
|
||||||
MemoryViewUtil.openError(DebugUIMessages.GoToAddressAction_Go_to_address_failed,
|
|
||||||
DebugUIMessages.GoToAddressAction_Address_is_invalid, nfe);
|
|
||||||
}
|
|
||||||
|
|
||||||
IMemoryRenderingContainer containers[] = fSite.getMemoryRenderingContainers();
|
|
||||||
for(int i = 0; i < containers.length; i++)
|
|
||||||
{
|
|
||||||
if(containers[i] instanceof RenderingViewPane)
|
|
||||||
{
|
|
||||||
BigInteger absoluteAddress = null;
|
|
||||||
if(fGotoAddress.isGoToAddress())
|
|
||||||
absoluteAddress = address;
|
|
||||||
|
|
||||||
IMemoryBlock activeMemoryBlock = null;
|
|
||||||
|
|
||||||
if(address != null && containers[i] != null)
|
|
||||||
{
|
|
||||||
IMemoryRendering activeRendering = containers[i].getActiveRendering();
|
|
||||||
if(activeRendering != null)
|
|
||||||
{
|
|
||||||
activeMemoryBlock = activeRendering.getMemoryBlock();
|
|
||||||
IMemoryBlockExtension blockExtension = (IMemoryBlockExtension) activeMemoryBlock.getAdapter(IMemoryBlockExtension.class);
|
|
||||||
if(blockExtension != null)
|
|
||||||
{
|
|
||||||
BigInteger baseAddress = null;
|
|
||||||
BigInteger addressableSize = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
baseAddress = blockExtension.getBigBaseAddress();
|
|
||||||
addressableSize = BigInteger.valueOf(blockExtension.getAddressableSize());
|
|
||||||
}
|
|
||||||
catch(DebugException de)
|
|
||||||
{
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
if(baseAddress != null)
|
|
||||||
{
|
|
||||||
if(fGotoAddress.isOffset())
|
|
||||||
absoluteAddress = baseAddress.add(address);
|
|
||||||
else if(fGotoAddress.isJump() && addressableSize != null)
|
|
||||||
absoluteAddress = baseAddress.add(address.multiply(addressableSize));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1) Try to reposition the renderings using the IRepositionableMemoryRendering interface
|
|
||||||
if(absoluteAddress != null && activeRendering instanceof IRepositionableMemoryRendering)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
((IRepositionableMemoryRendering) activeRendering).goToAddress(absoluteAddress);
|
|
||||||
}
|
|
||||||
catch(DebugException de)
|
|
||||||
{
|
|
||||||
// do nothing
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -167,6 +88,16 @@ public class TraditionalGoToAddressRendering extends AbstractMemoryRendering {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
button = fGotoAddress.getButton(GoToAddressWidget.ID_GO_NEW_TAB);
|
||||||
|
if (button != null)
|
||||||
|
{
|
||||||
|
button.addSelectionListener(new SelectionAdapter() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
go(fGotoAddress.getExpressionText(), true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
fGotoAddress.getExpressionWidget().addKeyListener(new KeyAdapter() {
|
fGotoAddress.getExpressionWidget().addKeyListener(new KeyAdapter() {
|
||||||
public void keyPressed(KeyEvent e) {
|
public void keyPressed(KeyEvent e) {
|
||||||
if (e.keyCode == SWT.CR)
|
if (e.keyCode == SWT.CR)
|
||||||
|
@ -183,4 +114,157 @@ public class TraditionalGoToAddressRendering extends AbstractMemoryRendering {
|
||||||
return fControl;
|
return fControl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void go(final String expression, final boolean inNewTab)
|
||||||
|
{
|
||||||
|
IMemoryRenderingContainer containers[] = fSite.getMemoryRenderingContainers();
|
||||||
|
for(int i = 0; i < containers.length; i++)
|
||||||
|
{
|
||||||
|
if(containers[i] instanceof RenderingViewPane)
|
||||||
|
{
|
||||||
|
final IMemoryRenderingContainer container = containers[i];
|
||||||
|
if(containers[i] != null)
|
||||||
|
{
|
||||||
|
final IMemoryRendering activeRendering = containers[i].getActiveRendering();
|
||||||
|
if(activeRendering != null)
|
||||||
|
{
|
||||||
|
new Thread() {
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
IMemoryBlock activeMemoryBlock = activeRendering.getMemoryBlock();
|
||||||
|
IMemoryBlockExtension blockExtension = (IMemoryBlockExtension) activeMemoryBlock.getAdapter(IMemoryBlockExtension.class);
|
||||||
|
|
||||||
|
if(inNewTab)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
final IMemoryRendering rendering = new CreateRendering(container);
|
||||||
|
IMemoryBlock newBlock = null;
|
||||||
|
if(activeMemoryBlock.getDebugTarget() instanceof IMemoryBlockRetrievalExtension)
|
||||||
|
{
|
||||||
|
newBlock = ((IMemoryBlockRetrievalExtension) activeMemoryBlock.getDebugTarget())
|
||||||
|
.getExtendedMemoryBlock(expression, activeMemoryBlock.getDebugTarget());
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BigInteger newAddress;
|
||||||
|
if(expression.toUpperCase().startsWith("0X"))
|
||||||
|
newAddress = new BigInteger(expression.substring(2), 16);
|
||||||
|
else
|
||||||
|
newAddress = new BigInteger(expression, 16);
|
||||||
|
|
||||||
|
newBlock = activeMemoryBlock.getDebugTarget().getMemoryBlock(newAddress.longValue(),
|
||||||
|
activeMemoryBlock.getLength());
|
||||||
|
}
|
||||||
|
|
||||||
|
final IMemoryBlock finalNewBlock = newBlock;
|
||||||
|
Display.getDefault().asyncExec(new Runnable(){
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
rendering.init(container, finalNewBlock);
|
||||||
|
container.addMemoryRendering(rendering);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (DebugException e) {
|
||||||
|
MemoryViewUtil.openError(DebugUIMessages.GoToAddressAction_Go_to_address_failed,
|
||||||
|
DebugUIMessages.GoToAddressAction_Address_is_invalid, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(activeRendering instanceof IRepositionableMemoryRendering)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if(activeMemoryBlock.getDebugTarget() instanceof IMemoryBlockRetrievalExtension)
|
||||||
|
{
|
||||||
|
IMemoryBlockExtension resolveExpressionBlock = ((IMemoryBlockRetrievalExtension) activeMemoryBlock.getDebugTarget())
|
||||||
|
.getExtendedMemoryBlock(expression, activeMemoryBlock.getDebugTarget());
|
||||||
|
((IRepositionableMemoryRendering) activeRendering).goToAddress(resolveExpressionBlock.getBigBaseAddress());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BigInteger newAddress;
|
||||||
|
if(expression.toUpperCase().startsWith("0X"))
|
||||||
|
newAddress = new BigInteger(expression.substring(2), 16);
|
||||||
|
else
|
||||||
|
newAddress = new BigInteger(expression, 16);
|
||||||
|
|
||||||
|
((IRepositionableMemoryRendering) activeRendering).goToAddress(newAddress);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(DebugException de)
|
||||||
|
{
|
||||||
|
MemoryViewUtil.openError(DebugUIMessages.GoToAddressAction_Go_to_address_failed,
|
||||||
|
DebugUIMessages.GoToAddressAction_Address_is_invalid, de);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class GoToAddressWidget {
|
||||||
|
|
||||||
|
private Text fExpression;
|
||||||
|
private Button fOKButton;
|
||||||
|
private Button fOKNewTabButton;
|
||||||
|
private Composite fComposite;
|
||||||
|
|
||||||
|
protected static int ID_GO_NEW_TAB = 2000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param parent
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Control createControl(Composite parent)
|
||||||
|
{
|
||||||
|
fComposite = new Composite(parent, SWT.NONE);
|
||||||
|
PlatformUI.getWorkbench().getHelpSystem().setHelp(fComposite, DebugUIPlugin.getUniqueIdentifier() + ".GoToAddressComposite_context"); //$NON-NLS-1$
|
||||||
|
GridLayout layout = new GridLayout();
|
||||||
|
layout.numColumns = 6;
|
||||||
|
layout.makeColumnsEqualWidth = false;
|
||||||
|
layout.marginHeight = 0;
|
||||||
|
layout.marginLeft = 0;
|
||||||
|
fComposite.setLayout(layout);
|
||||||
|
|
||||||
|
fExpression = new Text(fComposite, SWT.SINGLE | SWT.BORDER);
|
||||||
|
fExpression.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
|
||||||
|
|
||||||
|
fOKButton = new Button(fComposite, SWT.NONE);
|
||||||
|
fOKButton.setText("Go");
|
||||||
|
|
||||||
|
// fOKNewTabButton = new Button(fComposite, SWT.NONE);
|
||||||
|
// fOKNewTabButton.setText("New Tab");
|
||||||
|
|
||||||
|
return fComposite;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getHeight()
|
||||||
|
{
|
||||||
|
int height = fComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Button getButton(int id)
|
||||||
|
{
|
||||||
|
if (id == IDialogConstants.OK_ID)
|
||||||
|
return fOKButton;
|
||||||
|
if (id == ID_GO_NEW_TAB)
|
||||||
|
return fOKNewTabButton;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getExpressionText()
|
||||||
|
{
|
||||||
|
return fExpression.getText().trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Text getExpressionWidget()
|
||||||
|
{
|
||||||
|
return fExpression;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue