blob: e3763ed3ff8f708db387ec8a6a955e09d6b8abe6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 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 implementation
*******************************************************************************/
package org.eclipse.jdt.internal.debug.ui.actions;
import org.eclipse.debug.core.DebugException;
import org.eclipse.jdt.debug.core.IJavaVariable;
import org.eclipse.jdt.internal.debug.ui.IJavaDebugHelpContextIds;
import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.SelectionAdapter;
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.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
/**
* A dialog which prompts the user to enter a new value for a
* String variable. The user is given the option of entering the
* literal value that they want assigned to the String or entering
* an expression for evaluation.
*/
public class StringValueInputDialog extends ExpressionInputDialog {
private TextViewer fTextViewer;
private Button fTextButton;
private Button fEvaluationButton;
private Button fWrapText;
private Group fTextGroup;
private boolean fUseLiteralValue= true;
private static final String USE_EVALUATION = "USE_EVALUATION"; //$NON-NLS-1$
private static final String WRAP_TEXT = "WRAP_TEXT"; //$NON-NLS-1$
/**
* @param parentShell
* @param variable
*/
protected StringValueInputDialog(Shell parentShell, IJavaVariable variable) {
super(parentShell, variable);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.actions.ExpressionInputDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent) {
IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getHelpSystem().setHelp(
parent,
IJavaDebugHelpContextIds.STRING_VALUE_INPUT_DIALOG);
return super.createDialogArea(parent);
}
/**
* Override superclass method to insert toggle buttons
* immediately after the input area.
*/
protected void createInputArea(Composite parent) {
super.createInputArea(parent);
createRadioButtons(parent);
Dialog.applyDialogFont(parent);
}
/**
* Override superclass method to create the appropriate viewer
* (source viewer or simple text viewer) in the input area.
*/
protected void populateInputArea() {
boolean useEvaluation= false;
IDialogSettings settings = getDialogSettings();
if (settings != null) {
useEvaluation= settings.getBoolean(USE_EVALUATION);
}
if (useEvaluation) {
createSourceViewer();
fUseLiteralValue= false;
fEvaluationButton.setSelection(true);
} else {
createTextViewer();
fTextButton.setSelection(true);
}
}
/**
* Creates the text viewer that allows the user to enter a new String
* value.
*/
private void createTextViewer() {
fTextGroup= new Group(fInputArea, SWT.NONE);
fTextGroup.setLayout(new GridLayout());
fTextGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
fTextGroup.setText(ActionMessages.StringValueInputDialog_0);
Composite parent= fTextGroup;
fTextViewer= new TextViewer(parent, SWT.MULTI | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
fTextViewer.setDocument(new Document());
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.widthHint= 300;
gridData.heightHint= 150;
fTextViewer.getTextWidget().setLayoutData(gridData);
try {
String valueString = fVariable.getValue().getValueString();
fTextViewer.getDocument().set(valueString);
fTextViewer.setSelectedRange(0, valueString.length());
} catch (DebugException e) {
JDIDebugUIPlugin.log(e);
}
fTextViewer.getControl().setFocus();
fWrapText= new Button(parent, SWT.CHECK);
fWrapText.setText(ActionMessages.StringValueInputDialog_4);
boolean wrap= true;
IDialogSettings settings = getDialogSettings();
if (settings != null) {
wrap= settings.getBoolean(WRAP_TEXT);
}
fWrapText.setSelection(wrap);
updateWordWrap();
fWrapText.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
updateWordWrap();
}
});
Dialog.applyDialogFont(fInputArea);
}
private void updateWordWrap() {
fTextViewer.getTextWidget().setWordWrap(fWrapText.getSelection());
}
/**
* Creates the radio buttons that allow the user to choose between
* simple text mode and evaluation mode.
*/
protected void createRadioButtons(Composite parent) {
fTextButton= new Button(parent, SWT.RADIO);
fTextButton.setText(ActionMessages.StringValueInputDialog_1);
fTextButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
handleRadioSelectionChanged();
}
});
fEvaluationButton= new Button(parent, SWT.RADIO);
fEvaluationButton.setText(ActionMessages.StringValueInputDialog_2);
}
/**
* The radio button selection has changed update the input widgetry
* to reflect the user's selection.
*/
private void handleRadioSelectionChanged() {
boolean literal = fTextButton.getSelection();
if (literal != fUseLiteralValue) {
fUseLiteralValue= literal;
if (fUseLiteralValue) {
disposeSourceViewer();
createTextViewer();
} else {
// Evaluation button selected
disposeTextViewer();
createSourceViewer();
}
fInputArea.layout(true, true);
}
}
/**
* Disposes of the text viewer and associated widgets.
*/
protected void disposeTextViewer() {
if (fTextGroup != null) {
fTextGroup.dispose();
fTextGroup= null;
}
if (fTextViewer != null) {
StyledText textWidget = fTextViewer.getTextWidget();
if (textWidget != null) {
textWidget.dispose();
}
fTextViewer= null;
}
if (fWrapText != null) {
fWrapText.dispose();
fWrapText= null;
}
}
/**
* Updates the error message based on the user's input.
*/
protected void refreshValidState() {
if (fSourceViewer != null) {
super.refreshValidState();
return;
}
// even an empty string is valid
setErrorMessage(null);
}
/**
* Override superclass method to persist user's evaluation/literal mode
* selection.
*/
protected void okPressed() {
IDialogSettings settings= getDialogSettings();
if (settings == null) {
settings= JDIDebugUIPlugin.getDefault().getDialogSettings().addNewSection(getDialogSettingsSectionName());
}
settings.put(USE_EVALUATION, fEvaluationButton.getSelection());
if (fWrapText != null) {
settings.put(WRAP_TEXT, fWrapText.getSelection());
}
super.okPressed();
}
/**
* Returns <code>true</code> if this dialog's result should be interpreted
* as a literal value and <code>false</code> if the result should be interpreted
* as an expression for evaluation.
*
* @return whether or not this dialog's result is a literal value.
*/
public boolean isUseLiteralValue() {
return fUseLiteralValue;
}
/**
* Override superclass method to return text from the simple text
* viewer if appropriate.
* @see ExpressionInputDialog#getText()
*/
protected String getText() {
if (fTextButton.getSelection()) {
return fTextViewer.getDocument().get();
}
return super.getText();
}
/**
* Override superclass method to dispose of the simple text viewer
* if appropriate.
* @see ExpressionInputDialog#dispose()
*/
protected void dispose() {
if (fTextButton.getSelection()) {
disposeTextViewer();
} else {
super.dispose();
}
}
/**
* Returns the dialog settings used for this dialog
* @return the dialog settings used for this dialog
*/
protected IDialogSettings getDialogSettings() {
return JDIDebugUIPlugin.getDefault().getDialogSettings().getSection(getDialogSettingsSectionName());
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.actions.ExpressionInputDialog#getDialogSettingsSectionName()
*/
protected String getDialogSettingsSectionName() {
return "STRING_VALUE_INPUT_DIALOG"; //$NON-NLS-1$
}
}