mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-11 10:15:39 +02:00
This completes the contribution of the memory space support for the memory view.
This commit is contained in:
parent
7bbaad75fa
commit
93b18262ed
8 changed files with 198 additions and 123 deletions
|
@ -12,6 +12,8 @@ package org.eclipse.cdt.debug.core.cdi.model;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.core.cdi.CDIException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The memory space manager provides varous memory-space related operations.
|
* The memory space manager provides varous memory-space related operations.
|
||||||
* The backend implementation of ICDITarget should implement this interface
|
* The backend implementation of ICDITarget should implement this interface
|
||||||
|
@ -30,6 +32,16 @@ public interface ICDIMemorySpaceManagement extends ICDIObject {
|
||||||
*/
|
*/
|
||||||
String addressToString(BigInteger address, String memorySpaceID);
|
String addressToString(BigInteger address, String memorySpaceID);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The inverse of addressToString
|
||||||
|
*
|
||||||
|
* @param str - the encoded string (contains memory space + hex address value)
|
||||||
|
* @param memorySpaceID_out the memory space ID
|
||||||
|
* @return the BigInteger part of str; client should return null if the default decoding provided
|
||||||
|
* by CDT is sufficient (<memory-space-id>:<address(hex)>)
|
||||||
|
*/
|
||||||
|
BigInteger stringToAddress(String str, StringBuffer memorySpaceID_out) throws CDIException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides the memory spaces available.
|
* Provides the memory spaces available.
|
||||||
*
|
*
|
||||||
|
|
|
@ -55,7 +55,10 @@ import org.w3c.dom.NodeList;
|
||||||
public class CMemoryBlockRetrievalExtension extends PlatformObject implements IMemoryBlockRetrievalExtension {
|
public class CMemoryBlockRetrievalExtension extends PlatformObject implements IMemoryBlockRetrievalExtension {
|
||||||
|
|
||||||
private static final String MEMORY_BLOCK_EXPRESSION_LIST = "memoryBlockExpressionList"; //$NON-NLS-1$
|
private static final String MEMORY_BLOCK_EXPRESSION_LIST = "memoryBlockExpressionList"; //$NON-NLS-1$
|
||||||
|
private static final String MEMORY_BLOCK_EXPRESSION_ITEM = "memoryBlockExpressionItem"; //$NON-NLS-1$
|
||||||
private static final String MEMORY_BLOCK_EXPRESSION = "expression"; //$NON-NLS-1$
|
private static final String MEMORY_BLOCK_EXPRESSION = "expression"; //$NON-NLS-1$
|
||||||
|
private static final String MEMORY_BLOCK_MEMSPACEID = "memorySpaceID"; //$NON-NLS-1$
|
||||||
|
private static final String ATTR_MEMORY_BLOCK_MEMSPACEID_TEXT = "text"; //$NON-NLS-1$
|
||||||
private static final String ATTR_MEMORY_BLOCK_EXPRESSION_TEXT = "text"; //$NON-NLS-1$
|
private static final String ATTR_MEMORY_BLOCK_EXPRESSION_TEXT = "text"; //$NON-NLS-1$
|
||||||
|
|
||||||
CDebugTarget fDebugTarget;
|
CDebugTarget fDebugTarget;
|
||||||
|
@ -83,35 +86,63 @@ public class CMemoryBlockRetrievalExtension extends PlatformObject implements IM
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void parseMementoExprItem(Element element, List expressions, List memorySpaceIDs) {
|
||||||
|
NodeList list = element.getChildNodes();
|
||||||
|
int length = list.getLength();
|
||||||
|
String exp = null;
|
||||||
|
String memorySpaceID = null;
|
||||||
|
for( int i = 0; i < length; ++i ) {
|
||||||
|
Node node = list.item( i );
|
||||||
|
if ( node.getNodeType() == Node.ELEMENT_NODE ) {
|
||||||
|
Element entry = (Element)node;
|
||||||
|
if ( entry.getNodeName().equalsIgnoreCase( MEMORY_BLOCK_EXPRESSION ) ) {
|
||||||
|
exp = entry.getAttribute( ATTR_MEMORY_BLOCK_EXPRESSION_TEXT );
|
||||||
|
} else if ( entry.getNodeName().equalsIgnoreCase( MEMORY_BLOCK_MEMSPACEID ) ) {
|
||||||
|
memorySpaceID = entry.getAttribute( ATTR_MEMORY_BLOCK_MEMSPACEID_TEXT );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (exp != null) {
|
||||||
|
expressions.add( exp );
|
||||||
|
memorySpaceIDs.add( memorySpaceID );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void initializeFromMemento( String memento ) throws CoreException {
|
private void initializeFromMemento( String memento ) throws CoreException {
|
||||||
Element root = DebugPlugin.parseDocument( memento );
|
Element root = DebugPlugin.parseDocument( memento );
|
||||||
if ( root.getNodeName().equalsIgnoreCase( MEMORY_BLOCK_EXPRESSION_LIST ) ) {
|
if ( root.getNodeName().equalsIgnoreCase( MEMORY_BLOCK_EXPRESSION_LIST ) ) {
|
||||||
List expressions = new ArrayList();
|
List expressions = new ArrayList();
|
||||||
|
List memorySpaceIDs = new ArrayList();
|
||||||
NodeList list = root.getChildNodes();
|
NodeList list = root.getChildNodes();
|
||||||
int length = list.getLength();
|
int length = list.getLength();
|
||||||
for( int i = 0; i < length; ++i ) {
|
for( int i = 0; i < length; ++i ) {
|
||||||
Node node = list.item( i );
|
Node node = list.item( i );
|
||||||
short type = node.getNodeType();
|
if ( node.getNodeType() == Node.ELEMENT_NODE ) {
|
||||||
if ( type == Node.ELEMENT_NODE ) {
|
|
||||||
Element entry = (Element)node;
|
Element entry = (Element)node;
|
||||||
if ( entry.getNodeName().equalsIgnoreCase( MEMORY_BLOCK_EXPRESSION ) ) {
|
if ( entry.getNodeName().equalsIgnoreCase( MEMORY_BLOCK_EXPRESSION_ITEM ) ) {
|
||||||
String exp = entry.getAttribute( ATTR_MEMORY_BLOCK_EXPRESSION_TEXT );
|
parseMementoExprItem(entry, expressions, memorySpaceIDs);
|
||||||
expressions.add( exp );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
createMemoryBlocks( (String[])expressions.toArray( new String[expressions.size()] ) );
|
createMemoryBlocks( (String[])expressions.toArray( new String[expressions.size()]) ,
|
||||||
|
(String[])memorySpaceIDs.toArray( new String[memorySpaceIDs.size()]));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
abort( InternalDebugCoreMessages.getString( "CMemoryBlockRetrievalExtension.3" ), null ); //$NON-NLS-1$
|
abort( InternalDebugCoreMessages.getString( "CMemoryBlockRetrievalExtension.3" ), null ); //$NON-NLS-1$
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createMemoryBlocks( String[] expressions ) {
|
private void createMemoryBlocks( String[] expressions, String[] memorySpaceIDs ) {
|
||||||
ArrayList list = new ArrayList( expressions.length );
|
ArrayList list = new ArrayList( expressions.length );
|
||||||
for ( int i = 0; i < expressions.length; ++i ) {
|
for ( int i = 0; i < expressions.length; ++i ) {
|
||||||
IAddress address = getDebugTarget().getAddressFactory().createAddress( expressions[i] );
|
IAddress address = getDebugTarget().getAddressFactory().createAddress( expressions[i] );
|
||||||
if ( address != null ) {
|
if ( address != null ) {
|
||||||
list.add( new CMemoryBlockExtension( getDebugTarget(), address.toHexAddressString(), address.getValue() ) );
|
if (memorySpaceIDs[i] == null) {
|
||||||
|
list.add( new CMemoryBlockExtension( getDebugTarget(), address.toHexAddressString(), address.getValue() ) );
|
||||||
|
} else {
|
||||||
|
list.add( new CMemoryBlockExtension( getDebugTarget(), address.getValue(), memorySpaceIDs[i] ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DebugPlugin.getDefault().getMemoryBlockManager().addMemoryBlocks( (IMemoryBlock[])list.toArray( new IMemoryBlock[list.size()] ) );
|
DebugPlugin.getDefault().getMemoryBlockManager().addMemoryBlocks( (IMemoryBlock[])list.toArray( new IMemoryBlock[list.size()] ) );
|
||||||
|
@ -120,20 +151,54 @@ public class CMemoryBlockRetrievalExtension extends PlatformObject implements IM
|
||||||
public String getMemento() throws CoreException {
|
public String getMemento() throws CoreException {
|
||||||
IMemoryBlock[] blocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks( getDebugTarget() );
|
IMemoryBlock[] blocks = DebugPlugin.getDefault().getMemoryBlockManager().getMemoryBlocks( getDebugTarget() );
|
||||||
Document document = DebugPlugin.newDocument();
|
Document document = DebugPlugin.newDocument();
|
||||||
Element element = document.createElement( MEMORY_BLOCK_EXPRESSION_LIST );
|
Element exprList = document.createElement( MEMORY_BLOCK_EXPRESSION_LIST );
|
||||||
for ( int i = 0; i < blocks.length; ++i ) {
|
for ( int i = 0; i < blocks.length; ++i ) {
|
||||||
if ( blocks[i] instanceof IMemoryBlockExtension ) {
|
if ( blocks[i] instanceof IMemoryBlockExtension ) {
|
||||||
|
IMemoryBlockExtension memBlockExt = (IMemoryBlockExtension)blocks[i];
|
||||||
|
Element exprItem = document.createElement( MEMORY_BLOCK_EXPRESSION_ITEM );
|
||||||
|
exprList.appendChild(exprItem);
|
||||||
|
|
||||||
|
BigInteger addrBigInt = null;
|
||||||
|
String memorySpaceID = null;
|
||||||
|
if (hasMemorySpaces()) {
|
||||||
|
ICDITarget cdiTarget = fDebugTarget.getCDITarget();
|
||||||
|
StringBuffer sbuf = new StringBuffer();
|
||||||
|
try {
|
||||||
|
addrBigInt = ((ICDIMemorySpaceManagement)cdiTarget).stringToAddress(memBlockExt.getExpression(), sbuf);
|
||||||
|
if (addrBigInt == null) {
|
||||||
|
// Client wants our default decoding; minimum is "<space>:0x?"
|
||||||
|
addrBigInt = stringToAddress(memBlockExt.getExpression(), sbuf);
|
||||||
|
}
|
||||||
|
memorySpaceID = sbuf.toString();
|
||||||
|
}
|
||||||
|
catch( CDIException e ) {
|
||||||
|
CDebugCorePlugin.log( e );
|
||||||
|
addrBigInt = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Element child = document.createElement( MEMORY_BLOCK_EXPRESSION );
|
Element child = document.createElement( MEMORY_BLOCK_EXPRESSION );
|
||||||
try {
|
try {
|
||||||
child.setAttribute( ATTR_MEMORY_BLOCK_EXPRESSION_TEXT, ((IMemoryBlockExtension)blocks[i]).getBigBaseAddress().toString() );
|
if (addrBigInt != null && memorySpaceID != null) {
|
||||||
element.appendChild( child );
|
child.setAttribute( ATTR_MEMORY_BLOCK_EXPRESSION_TEXT, addrBigInt.toString() );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
child.setAttribute( ATTR_MEMORY_BLOCK_EXPRESSION_TEXT, memBlockExt.getBigBaseAddress().toString() );
|
||||||
|
}
|
||||||
|
exprItem.appendChild( child );
|
||||||
}
|
}
|
||||||
catch( DebugException e ) {
|
catch( DebugException e ) {
|
||||||
CDebugCorePlugin.log( e.getStatus() );
|
CDebugCorePlugin.log( e.getStatus() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (memorySpaceID != null) {
|
||||||
|
child = document.createElement( MEMORY_BLOCK_MEMSPACEID );
|
||||||
|
child.setAttribute( ATTR_MEMORY_BLOCK_MEMSPACEID_TEXT, memorySpaceID);
|
||||||
|
exprItem.appendChild( child );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
document.appendChild( element );
|
document.appendChild( exprList );
|
||||||
return DebugPlugin.serializeDocument( document );
|
return DebugPlugin.serializeDocument( document );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,12 +349,13 @@ public class CMemoryBlockRetrievalExtension extends PlatformObject implements IM
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks the CDI backend to see is memory spaces are supported
|
* Checks the CDI backend to see is memory spaces are supported and actually
|
||||||
|
* available for the target process.
|
||||||
*
|
*
|
||||||
* @return true if the backend supports memory spaces
|
* @return true if the backend supports memory spaces
|
||||||
*/
|
*/
|
||||||
public boolean supportsMemorySpaces() {
|
public boolean hasMemorySpaces() {
|
||||||
return fDebugTarget.getCDITarget() instanceof ICDIMemorySpaceManagement;
|
return getMemorySpaces().length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -304,4 +370,33 @@ public class CMemoryBlockRetrievalExtension extends PlatformObject implements IM
|
||||||
|
|
||||||
return new String[0];
|
return new String[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* static implementation of
|
||||||
|
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIMemorySpaceManagement#addressToString(java.math.BigInteger, java.lang.String)
|
||||||
|
* client may choose not to provide the encoding/decoding and instead use our built-in handling.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static String addressToString(BigInteger address, String memorySpaceID) {
|
||||||
|
return memorySpaceID + ":0x" + address.toString(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* static implementation of
|
||||||
|
* @see org.eclipse.cdt.debug.core.cdi.model.ICDIMemorySpaceManagement#stringToAddr(java.lang.String, java.math.BigInteger, java.lang.StringBuffer)
|
||||||
|
* client may choose not to provide the encoding/decoding and instead use our built-in handling.
|
||||||
|
*/
|
||||||
|
public static BigInteger stringToAddress(String str, StringBuffer memorySpaceID_out) throws CoreException {
|
||||||
|
int index = str.lastIndexOf(':');
|
||||||
|
|
||||||
|
// minimum is "<space>:0x?"
|
||||||
|
if (index == -1 || str.length() <= index + 3 || str.charAt(index+1) != '0' || str.charAt(index+2) != 'x') {
|
||||||
|
IStatus s = new Status( IStatus.ERROR, CDebugCorePlugin.getUniqueIdentifier(), CDebugCorePlugin.INTERNAL_ERROR, InternalDebugCoreMessages.getString( "CMemoryBlockRetrievalExtension.5" ), null );
|
||||||
|
throw new CoreException( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
memorySpaceID_out.setLength(0);
|
||||||
|
memorySpaceID_out.append(str.substring(0, index));
|
||||||
|
return new BigInteger(str.substring(index+3), 16);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -26,6 +26,7 @@ import org.eclipse.cdt.debug.core.cdi.model.ICDIMemorySpaceManagement;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
|
||||||
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
|
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
|
||||||
import org.eclipse.cdt.debug.core.model.IExecFileInfo;
|
import org.eclipse.cdt.debug.core.model.IExecFileInfo;
|
||||||
|
import org.eclipse.cdt.debug.internal.core.CMemoryBlockRetrievalExtension;
|
||||||
import org.eclipse.debug.core.DebugEvent;
|
import org.eclipse.debug.core.DebugEvent;
|
||||||
import org.eclipse.debug.core.DebugException;
|
import org.eclipse.debug.core.DebugException;
|
||||||
import org.eclipse.debug.core.DebugPlugin;
|
import org.eclipse.debug.core.DebugPlugin;
|
||||||
|
@ -100,8 +101,8 @@ public class CMemoryBlockExtension extends CDebugElement implements IMemoryBlock
|
||||||
|
|
||||||
if (fExpression == null)
|
if (fExpression == null)
|
||||||
// If the backend supports memory spaces, it should implement ICDIMemorySpaceManagement
|
// If the backend supports memory spaces, it should implement ICDIMemorySpaceManagement
|
||||||
// If not, we use a default encoding
|
// Even if it does, it may choose to use our built-in encoding/decoding
|
||||||
fExpression = memorySpaceID + ':' + baseAddress.toString(16);
|
fExpression = CMemoryBlockRetrievalExtension.addressToString(baseAddress, memorySpaceID);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
|
|
@ -40,7 +40,7 @@ public class CMemoryAdapterFactory implements IAdapterFactory {
|
||||||
|
|
||||||
if (adapterType.equals(IAddMemoryBlocksTarget.class)) {
|
if (adapterType.equals(IAddMemoryBlocksTarget.class)) {
|
||||||
if (adaptableObject instanceof CMemoryBlockRetrievalExtension) {
|
if (adaptableObject instanceof CMemoryBlockRetrievalExtension) {
|
||||||
if (((CMemoryBlockRetrievalExtension)adaptableObject).supportsMemorySpaces())
|
if (((CMemoryBlockRetrievalExtension)adaptableObject).hasMemorySpaces())
|
||||||
return fgAddMemoryBlocks;
|
return fgAddMemoryBlocks;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,12 +18,14 @@ import org.eclipse.debug.core.model.IMemoryBlockRetrieval;
|
||||||
import org.eclipse.debug.ui.IDebugUIConstants;
|
import org.eclipse.debug.ui.IDebugUIConstants;
|
||||||
import org.eclipse.jface.dialogs.TrayDialog;
|
import org.eclipse.jface.dialogs.TrayDialog;
|
||||||
import org.eclipse.swt.SWT;
|
import org.eclipse.swt.SWT;
|
||||||
import org.eclipse.swt.events.FocusEvent;
|
|
||||||
import org.eclipse.swt.events.FocusListener;
|
|
||||||
import org.eclipse.swt.events.ModifyEvent;
|
import org.eclipse.swt.events.ModifyEvent;
|
||||||
import org.eclipse.swt.events.ModifyListener;
|
import org.eclipse.swt.events.ModifyListener;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.events.SelectionListener;
|
||||||
import org.eclipse.swt.events.VerifyEvent;
|
import org.eclipse.swt.events.VerifyEvent;
|
||||||
import org.eclipse.swt.events.VerifyListener;
|
import org.eclipse.swt.events.VerifyListener;
|
||||||
|
import org.eclipse.swt.graphics.FontMetrics;
|
||||||
|
import org.eclipse.swt.graphics.GC;
|
||||||
import org.eclipse.swt.layout.GridData;
|
import org.eclipse.swt.layout.GridData;
|
||||||
import org.eclipse.swt.layout.GridLayout;
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
import org.eclipse.swt.widgets.Button;
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
@ -31,7 +33,6 @@ import org.eclipse.swt.widgets.Combo;
|
||||||
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.Shell;
|
import org.eclipse.swt.widgets.Shell;
|
||||||
import org.eclipse.swt.widgets.Text;
|
|
||||||
import org.eclipse.ui.PlatformUI;
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -39,24 +40,22 @@ import org.eclipse.ui.PlatformUI;
|
||||||
* debug target that supports memory spaces.
|
* debug target that supports memory spaces.
|
||||||
* <p>
|
* <p>
|
||||||
* It differs from the platform one in that you can enter an expression or
|
* It differs from the platform one in that you can enter an expression or
|
||||||
* an memory space + address pair.
|
* an address + memory space pair.
|
||||||
*
|
*
|
||||||
* @since 3.2
|
* @since 3.2
|
||||||
*/
|
*/
|
||||||
public class AddMemoryBlockDialog extends TrayDialog implements ModifyListener, FocusListener, VerifyListener {
|
public class AddMemoryBlockDialog extends TrayDialog implements ModifyListener, SelectionListener {
|
||||||
|
|
||||||
private Combo fAddressInput;
|
private Combo fAddressInput;
|
||||||
|
private Button fAddressRadio;
|
||||||
private Combo fMemorySpaceInput;
|
private Combo fMemorySpaceInput;
|
||||||
private Combo fExpressionInput;
|
private Combo fExpressionInput;
|
||||||
private String fExpression;
|
private String fExpression;
|
||||||
|
private Button fExpressionRadio;
|
||||||
private String fAddress;
|
private String fAddress;
|
||||||
private String fMemorySpace;
|
private String fMemorySpace;
|
||||||
private boolean fExpressionEntered;
|
private boolean fEnteredExpression; // basically, which of the two radio buttons was selected when OK was hit
|
||||||
private CMemoryBlockRetrievalExtension fMemRetrieval;
|
private CMemoryBlockRetrievalExtension fMemRetrieval;
|
||||||
private Button fEnterAddr;
|
|
||||||
private Button fEnterExpression;
|
|
||||||
|
|
||||||
private static boolean sfExpressionSetLast = false; // used to persist the default entry-type selection
|
|
||||||
|
|
||||||
private static ArrayList sAddressHistory = new ArrayList();
|
private static ArrayList sAddressHistory = new ArrayList();
|
||||||
private static ArrayList sExpressionHistory = new ArrayList();
|
private static ArrayList sExpressionHistory = new ArrayList();
|
||||||
|
@ -96,22 +95,40 @@ public class AddMemoryBlockDialog extends TrayDialog implements ModifyListener,
|
||||||
composite.setLayoutData(gridData);
|
composite.setLayoutData(gridData);
|
||||||
parent = composite; // for all our widgets, the two-column composite is the real parent
|
parent = composite; // for all our widgets, the two-column composite is the real parent
|
||||||
|
|
||||||
fEnterAddr = new Button(parent, SWT.RADIO);
|
fAddressRadio = new Button(parent, SWT.RADIO);
|
||||||
|
final int radioButtonWidth = fAddressRadio.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
|
||||||
// take this opportunity to get the width of just the radion buton
|
fAddressRadio.setText(Messages.AddMemBlockDlg_enterAddrAndMemSpace);
|
||||||
// (w/no text), as we'll need it below
|
|
||||||
int buttonWidth = fEnterAddr.computeSize(SWT.DEFAULT, SWT.DEFAULT, false).x;
|
|
||||||
|
|
||||||
fEnterAddr.setText(Messages.AddMemBlockDlg_enterMemSpaceAndAddr);
|
|
||||||
gridData = new GridData(GridData.FILL_HORIZONTAL);
|
gridData = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
gridData.horizontalSpan = 2;
|
gridData.horizontalSpan = 2;
|
||||||
fEnterAddr.setLayoutData(gridData);
|
fAddressRadio.setLayoutData(gridData);
|
||||||
|
fAddressRadio.addSelectionListener(this);
|
||||||
|
|
||||||
fMemorySpaceInput = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
|
fMemorySpaceInput = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
|
||||||
gridData = new GridData();
|
gridData = new GridData();
|
||||||
gridData.horizontalIndent = buttonWidth;
|
gridData.horizontalIndent = radioButtonWidth;
|
||||||
fMemorySpaceInput.setLayoutData(gridData);
|
fMemorySpaceInput.setLayoutData(gridData);
|
||||||
fMemorySpaceInput.addFocusListener(this);
|
fMemorySpaceInput.addSelectionListener(this);
|
||||||
|
|
||||||
|
fAddressInput = new Combo(parent, SWT.BORDER);
|
||||||
|
gridData = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
|
GC gc = new GC(fAddressInput);
|
||||||
|
FontMetrics fm = gc.getFontMetrics();
|
||||||
|
// Give enough room for a 64 bit hex address (25 is a guess at the combobox selector)
|
||||||
|
gridData.minimumWidth = gridData.minimumWidth = 18 * fm.getAverageCharWidth() + 25;
|
||||||
|
gc.dispose();
|
||||||
|
fAddressInput.setLayoutData(gridData);
|
||||||
|
fAddressInput.addModifyListener(this);
|
||||||
|
fAddressInput.addVerifyListener(new VerifyListener() {
|
||||||
|
// limit entry to hex or decimal
|
||||||
|
public void verifyText(VerifyEvent e) {
|
||||||
|
e.doit = false;
|
||||||
|
final char c = e.character;
|
||||||
|
if (Character.isDigit(c) || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F') ||
|
||||||
|
c == 'x' || Character.isISOControl(e.character)) {
|
||||||
|
e.doit = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Populate the memory space combobox with the available spaces
|
// Populate the memory space combobox with the available spaces
|
||||||
if (fMemRetrieval != null) {
|
if (fMemRetrieval != null) {
|
||||||
|
@ -123,26 +140,18 @@ public class AddMemoryBlockDialog extends TrayDialog implements ModifyListener,
|
||||||
fMemorySpaceInput.select(0);
|
fMemorySpaceInput.select(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
fAddressInput = new Combo(parent, SWT.BORDER);
|
fExpressionRadio = new Button(parent, SWT.RADIO);
|
||||||
gridData = new GridData(GridData.FILL_HORIZONTAL);
|
fExpressionRadio.setText(Messages.AddMemBlockDlg_enterExpression);
|
||||||
fAddressInput.setLayoutData(gridData);
|
gridData = new GridData();
|
||||||
fAddressInput.addModifyListener(this);
|
|
||||||
fAddressInput.addFocusListener(this);
|
|
||||||
fAddressInput.addVerifyListener(this);
|
|
||||||
|
|
||||||
fEnterExpression = new Button(parent, SWT.RADIO);
|
|
||||||
fEnterExpression.setText(Messages.AddMemBlockDlg_enterExpression);
|
|
||||||
gridData = new GridData(GridData.FILL_HORIZONTAL);
|
|
||||||
gridData.horizontalSpan = 2;
|
gridData.horizontalSpan = 2;
|
||||||
fEnterExpression.setLayoutData(gridData);
|
fExpressionRadio.setLayoutData(gridData);
|
||||||
|
fExpressionRadio.addSelectionListener(this);
|
||||||
|
|
||||||
fExpressionInput = new Combo(parent, SWT.BORDER);
|
fExpressionInput = new Combo(parent, SWT.BORDER);
|
||||||
gridData = new GridData(GridData.FILL_HORIZONTAL);
|
gridData = new GridData(GridData.FILL_HORIZONTAL);
|
||||||
gridData.horizontalSpan = 2;
|
gridData.horizontalSpan = 2;
|
||||||
gridData.horizontalIndent = buttonWidth;
|
gridData.horizontalIndent = radioButtonWidth;
|
||||||
fExpressionInput.setLayoutData(gridData);
|
fExpressionInput.setLayoutData(gridData);
|
||||||
fExpressionInput.addModifyListener(this);
|
|
||||||
fExpressionInput.addFocusListener(this);
|
|
||||||
|
|
||||||
// add the history into the combo boxes
|
// add the history into the combo boxes
|
||||||
String[] history = getHistory(sExpressionHistory);
|
String[] history = getHistory(sExpressionHistory);
|
||||||
|
@ -153,15 +162,7 @@ public class AddMemoryBlockDialog extends TrayDialog implements ModifyListener,
|
||||||
for (int i = 0; i < history.length; i++)
|
for (int i = 0; i < history.length; i++)
|
||||||
fAddressInput.add(history[i]);
|
fAddressInput.add(history[i]);
|
||||||
|
|
||||||
fExpressionInput.addFocusListener(this);
|
fExpressionInput.addModifyListener(this);
|
||||||
|
|
||||||
fEnterExpression.setSelection(sfExpressionSetLast);
|
|
||||||
fEnterAddr.setSelection(!sfExpressionSetLast);
|
|
||||||
if (sfExpressionSetLast) {
|
|
||||||
fExpressionInput.forceFocus();
|
|
||||||
} else {
|
|
||||||
fAddressInput.forceFocus();
|
|
||||||
}
|
|
||||||
|
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
@ -180,8 +181,6 @@ public class AddMemoryBlockDialog extends TrayDialog implements ModifyListener,
|
||||||
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
|
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
|
||||||
*/
|
*/
|
||||||
protected void okPressed() {
|
protected void okPressed() {
|
||||||
|
|
||||||
fExpressionEntered = fEnterExpression.getSelection();
|
|
||||||
fExpression = fExpressionInput.getText();
|
fExpression = fExpressionInput.getText();
|
||||||
fAddress = fAddressInput.getText();
|
fAddress = fAddressInput.getText();
|
||||||
fMemorySpace = fMemorySpaceInput.getText();
|
fMemorySpace = fMemorySpaceInput.getText();
|
||||||
|
@ -192,9 +191,7 @@ public class AddMemoryBlockDialog extends TrayDialog implements ModifyListener,
|
||||||
if (fAddress.length() > 0)
|
if (fAddress.length() > 0)
|
||||||
addHistory(sAddressHistory, fAddress);
|
addHistory(sAddressHistory, fAddress);
|
||||||
|
|
||||||
// this will persist the entry type from one dialog invocation to another
|
fEnteredExpression = fExpressionRadio.getSelection();
|
||||||
sfExpressionSetLast = fExpressionEntered;
|
|
||||||
|
|
||||||
super.okPressed();
|
super.okPressed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,13 +199,14 @@ public class AddMemoryBlockDialog extends TrayDialog implements ModifyListener,
|
||||||
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
|
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
|
||||||
*/
|
*/
|
||||||
public void modifyText(ModifyEvent e) {
|
public void modifyText(ModifyEvent e) {
|
||||||
// if user enters text into one of the two input options, disable/gray the other
|
// if user enters text into either the address field or the expression one, automatically
|
||||||
// to make the mutual exlusivity obvious
|
// select its associated radio button (and deselect the other, these are mutually exclusive)
|
||||||
fAddressInput.setEnabled(fExpressionInput.getText().length() == 0);
|
if (e.widget == fAddressInput ||
|
||||||
fEnterAddr.setEnabled(fExpressionInput.getText().length() == 0);
|
e.widget == fExpressionInput) {
|
||||||
fMemorySpaceInput.setEnabled(fExpressionInput.getText().length() == 0);
|
|
||||||
fExpressionInput.setEnabled(fAddressInput.getText().length() == 0);
|
fAddressRadio.setSelection(e.widget != fExpressionInput);
|
||||||
fEnterExpression.setEnabled(fAddressInput.getText().length() == 0);
|
fExpressionRadio.setSelection(e.widget == fExpressionInput);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
@ -230,8 +228,8 @@ public class AddMemoryBlockDialog extends TrayDialog implements ModifyListener,
|
||||||
return fMemorySpace;
|
return fMemorySpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean wasExpressionEntered() {
|
public boolean enteredExpression() {
|
||||||
return fExpressionEntered;
|
return fEnteredExpression;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addHistory(ArrayList list, String item) {
|
private static void addHistory(ArrayList list, String item) {
|
||||||
|
@ -247,52 +245,22 @@ public class AddMemoryBlockDialog extends TrayDialog implements ModifyListener,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.swt.events.FocusListener#focusGained(org.eclipse.swt.events.FocusEvent)
|
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
|
||||||
*/
|
*/
|
||||||
public void focusGained(FocusEvent e) {
|
public void widgetDefaultSelected(SelectionEvent e) {
|
||||||
// when the user gives focus to one of the combo boxes, shift the radio button state accordingly
|
// TODO Auto-generated method stub
|
||||||
if (e.widget == fAddressInput || e.widget == fMemorySpaceInput) {
|
|
||||||
fEnterAddr.setSelection(true);
|
|
||||||
fEnterExpression.setSelection(false);
|
|
||||||
}
|
|
||||||
else if (e.widget == fExpressionInput) {
|
|
||||||
fEnterAddr.setSelection(false);
|
|
||||||
fEnterExpression.setSelection(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.eclipse.swt.events.FocusListener#focusLost(org.eclipse.swt.events.FocusEvent)
|
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
|
||||||
*/
|
*/
|
||||||
public void focusLost(FocusEvent e) {
|
public void widgetSelected(SelectionEvent e) {
|
||||||
}
|
// if user selects a memory space, select its associated radio button (and deselect the
|
||||||
|
// other, these are mutually exclusive)
|
||||||
/* (non-Javadoc)
|
if (e.widget == fMemorySpaceInput) {
|
||||||
* @see org.eclipse.swt.events.VerifyListener#verifyText(org.eclipse.swt.events.VerifyEvent)
|
fAddressRadio.setSelection(true);
|
||||||
*/
|
fExpressionRadio.setSelection(false);
|
||||||
public void verifyText(VerifyEvent event) {
|
|
||||||
if (event.widget == fAddressInput) {
|
|
||||||
// assume we won't allow it
|
|
||||||
event.doit = false;
|
|
||||||
|
|
||||||
char c = event.character;
|
|
||||||
|
|
||||||
String textAlreadyInControl = ((Combo)event.widget).getText();
|
|
||||||
|
|
||||||
if ((c == 'x') && (textAlreadyInControl.length() == 1)
|
|
||||||
&& textAlreadyInControl.charAt(0) == '0') {
|
|
||||||
// allow 'x' if it's the second character and the first is zero.
|
|
||||||
// Note that this level of verification has a hole; user can use
|
|
||||||
// ISO control characters (e.g., the Delete key) to move the 'x'
|
|
||||||
// in the first slot. Oh well; this doesn't need to be bullet proof
|
|
||||||
event.doit = true;
|
|
||||||
} else if ((c == '\b') || // allow backspace
|
|
||||||
Character.isDigit(c) || ('a' <= c && c <= 'f')
|
|
||||||
|| ('A' <= c && c <= 'F')) {
|
|
||||||
event.doit = true;
|
|
||||||
} else if (Character.isISOControl(c)) {
|
|
||||||
event.doit = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,8 +89,7 @@ public class AddMemoryBlocks implements IAddMemoryBlocksTarget {
|
||||||
if (returnCode == Window.CANCEL)
|
if (returnCode == Window.CANCEL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
String input = (dialog.getAddress().length() > 0) ? dialog.getAddress()
|
String input = dialog.enteredExpression() ? dialog.getExpression() : dialog.getAddress();
|
||||||
: dialog.getExpression();
|
|
||||||
|
|
||||||
ArrayList list = new ArrayList();
|
ArrayList list = new ArrayList();
|
||||||
|
|
||||||
|
@ -105,7 +104,7 @@ public class AddMemoryBlocks implements IAddMemoryBlocksTarget {
|
||||||
final String[] addrsOrExprs = (String[]) list.toArray(new String[list.size()]);
|
final String[] addrsOrExprs = (String[]) list.toArray(new String[list.size()]);
|
||||||
|
|
||||||
ParamHolder params;
|
ParamHolder params;
|
||||||
if (dialog.wasExpressionEntered())
|
if (dialog.enteredExpression())
|
||||||
params = new ExpressionsHolder(addrsOrExprs);
|
params = new ExpressionsHolder(addrsOrExprs);
|
||||||
else
|
else
|
||||||
params = new AddressAndSpaceHolder(addrsOrExprs, dialog.getMemorySpace());
|
params = new AddressAndSpaceHolder(addrsOrExprs, dialog.getMemorySpace());
|
||||||
|
|
|
@ -22,7 +22,7 @@ public class Messages extends NLS {
|
||||||
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
|
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String AddMemBlockDlg_enterMemSpaceAndAddr;
|
public static String AddMemBlockDlg_enterAddrAndMemSpace;
|
||||||
public static String AddMemBlockDlg_enterExpression;
|
public static String AddMemBlockDlg_enterExpression;
|
||||||
public static String AddMemBlockDlg_or;
|
public static String AddMemBlockDlg_or;
|
||||||
public static String AddMemBlockDlg_MonitorMemory;
|
public static String AddMemBlockDlg_MonitorMemory;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
AddMemBlockDlg_enterMemSpaceAndAddr=Enter memory space and address
|
AddMemBlockDlg_enterAddrAndMemSpace=Enter memory space and address
|
||||||
AddMemBlockDlg_enterExpression=Enter expression
|
AddMemBlockDlg_enterExpression=Enter expression
|
||||||
AddMemBlockDlg_or=or
|
AddMemBlockDlg_or=or
|
||||||
AddMemBlockDlg_MonitorMemory = Monitor Memory
|
AddMemBlockDlg_MonitorMemory = Monitor Memory
|
||||||
|
|
Loading…
Add table
Reference in a new issue