blob: 2fd4ef732b430a4fc26db64c9333412f253b0bdc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.debug.internal.ui.views.memory.renderings;
import java.math.BigInteger;
import org.eclipse.debug.internal.ui.DebugUIMessages;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
public class GoToAddressComposite {
private Text fExpression;
private Button fOKButton;
private Button fCancelButton;
private Composite fComposite;
private Combo fGoToCombo;
private Button fHexButton;
/**
* @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);
fGoToCombo = new Combo(fComposite, SWT.READ_ONLY);
fGoToCombo.add(DebugUIMessages.GoToAddressComposite_0);
fGoToCombo.add(DebugUIMessages.GoToAddressComposite_4);
fGoToCombo.add(DebugUIMessages.GoToAddressComposite_5);
fGoToCombo.select(0);
fExpression = new Text(fComposite, SWT.SINGLE | SWT.BORDER);
fExpression.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fHexButton = new Button(fComposite, SWT.CHECK);
fHexButton.setText(DebugUIMessages.GoToAddressComposite_6);
fHexButton.setSelection(true);
fOKButton = new Button(fComposite, SWT.NONE);
fOKButton.setText(DebugUIMessages.GoToAddressComposite_1);
fCancelButton = new Button(fComposite, SWT.NONE);
fCancelButton.setText(DebugUIMessages.GoToAddressComposite_2);
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;
else if (id == IDialogConstants.CANCEL_ID)
return fCancelButton;
return null;
}
public String getExpressionText()
{
return fExpression.getText();
}
public Text getExpressionWidget()
{
return fExpression;
}
public boolean isGoToAddress()
{
return fGoToCombo.getSelectionIndex() == 0;
}
public boolean isOffset()
{
return fGoToCombo.getSelectionIndex() == 1;
}
public boolean isJump()
{
return fGoToCombo.getSelectionIndex() == 2;
}
public boolean isHex()
{
return fHexButton.getSelection();
}
public BigInteger getGoToAddress(BigInteger baseAddress, BigInteger selectedAddress) throws NumberFormatException
{
boolean add = true;
String expression = getExpressionText();
boolean hex = isHex();
int radix = hex?16:10;
expression = expression.trim();
if (isGoToAddress())
{
expression = expression.toUpperCase();
if (expression.startsWith("0X")) //$NON-NLS-1$
{
expression = expression.substring(2);
radix = 16;
}
return new BigInteger(expression, radix);
}
if (expression.startsWith("+")) //$NON-NLS-1$
{
expression = expression.substring(1);
}
else if (expression.startsWith("-")) //$NON-NLS-1$
{
expression = expression.substring(1);
add = false;
}
expression = expression.toUpperCase();
if (expression.startsWith("0X")) //$NON-NLS-1$
{
expression = expression.substring(2);
radix = 16;
}
BigInteger gotoAddress = new BigInteger(expression, radix);
BigInteger address = baseAddress;
if (isJump())
address = selectedAddress;
if (address == null)
throw new NumberFormatException(DebugUIMessages.GoToAddressComposite_7);
if (add)
gotoAddress = address.add(gotoAddress);
else
gotoAddress = address.subtract(gotoAddress);
return gotoAddress;
}
}