blob: ccdbcde0c52e98c04f4abcd2e99d268714137cbd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial implementation
*******************************************************************************/
package org.eclipse.jdt.internal.debug.ui.actions;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.internal.ui.SWTFactory;
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.IDialogSettings;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
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 Group fTextGroup;
private TextViewer fTextViewer;
private Button fTextButton;
private Button fEvaluationButton;
private Button fWrapText;
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)
*/
@Override
protected Control createDialogArea(Composite parent) {
Control control = super.createDialogArea(parent);
IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getHelpSystem().setHelp(parent, IJavaDebugHelpContextIds.STRING_VALUE_INPUT_DIALOG);
return control;
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.ui.actions.ExpressionInputDialog#createInputArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Composite createInputArea(Composite parent) {
Composite composite = super.createInputArea(parent);
createRadioButtons(parent);
return composite;
}
/**
* Override superclass method to create the appropriate viewer
* (source viewer or simple text viewer) in the input area.
*/
@Override
protected void populateInputArea(Composite parent) {
super.populateInputArea(parent);
createTextViewer(parent);
// Use the stored dialog settings to determine what radio button is selected and what viewer to show.
boolean useEvaluation= false;
IDialogSettings settings = getDialogSettings();
if (settings != null) {
useEvaluation= settings.getBoolean(USE_EVALUATION);
}
setTextViewerVisible(!useEvaluation);
setSourceViewerVisible(useEvaluation);
fUseLiteralValue = !useEvaluation;
fEvaluationButton.setSelection(useEvaluation);
fTextButton.setSelection(!useEvaluation);
}
/**
* Creates the text viewer that allows the user to enter a new String
* value.
* @param parent parent composite
*/
private void createTextViewer(Composite parent) {
fTextGroup = SWTFactory.createGroup(parent, ActionMessages.StringValueInputDialog_0, 1, 1, GridData.FILL_BOTH);
fTextViewer= new TextViewer(fTextGroup, 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();
boolean wrap= true;
IDialogSettings settings = getDialogSettings();
if (settings != null) {
wrap= settings.getBoolean(WRAP_TEXT);
}
fWrapText = SWTFactory.createCheckButton(fTextGroup, ActionMessages.StringValueInputDialog_4, null, wrap, 1);
updateWordWrap();
fWrapText.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateWordWrap();
}
});
IDocumentListener listener = new IDocumentListener() {
@Override
public void documentAboutToBeChanged(DocumentEvent event) {
}
@Override
public void documentChanged(DocumentEvent event) {
refreshValidState(fTextViewer);
}
};
fTextViewer.getDocument().addDocumentListener(listener);
}
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 = SWTFactory.createRadioButton(parent, ActionMessages.StringValueInputDialog_1);
fTextButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleRadioSelectionChanged();
}
});
fEvaluationButton = SWTFactory.createRadioButton(parent, 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) {
setSourceViewerVisible(false);
setTextViewerVisible(true);
} else {
setTextViewerVisible(false);
setSourceViewerVisible(true);
}
fInputArea.layout(true, true);
refreshValidState();
}
}
/**
* Sets the visibility of the source viewer and the exclude attribute of its layout.
* @param value If <code>true</code>, the viewer will be visible, if <code>false</code>, the viewer will be hidden.
*/
protected void setTextViewerVisible(boolean value){
if (fTextGroup != null){
fTextGroup.setVisible(value);
GridData data = (GridData)fTextGroup.getLayoutData();
data.exclude = !value;
}
}
/**
* Updates the error message based on the user's input.
*/
@Override
protected void refreshValidState() {
if (isUseLiteralValue()) {
refreshValidState(fTextViewer);
} else {
super.refreshValidState();
}
}
/**
* Override superclass method to persist user's evaluation/literal mode
* selection.
*/
@Override
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()
*/
@Override
protected String getText() {
if (fTextButton.getSelection()) {
return fTextViewer.getDocument().get();
}
return super.getText();
}
/**
* 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()
*/
@Override
protected String getDialogSettingsSectionName() {
return "STRING_VALUE_INPUT_DIALOG"; //$NON-NLS-1$
}
}