blob: bb39befe8ebd2543bcc2dd8df6653a85a391503c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2015 Ericsson 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:
* Ericsson - Initial API and implementation
* Dmitry Kozlov (Mentor Graphics) - Trace control view enhancements (Bug 390827)
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.tracepoints;
import java.text.Collator;
import java.util.Locale;
import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin;
import org.eclipse.cdt.dsf.gdb.internal.ui.tracepoints.TraceControlView.FailedTraceVariableCreationException;
import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceVariableDMData;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.ResourceLocator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
public final class TraceVarDetailsDialog extends Dialog {
private Button createButton = null;
private Button refreshButton = null;
private Table table = null;
private TraceControlView fView = null;
private Text nameInput = null;
private Text valueInput = null;
private Image warningImage = null;
private Label warningIconLabel = null;
private Label warningTextLabel = null;
public TraceVarDetailsDialog(Shell shell, TraceControlView view) {
super(shell);
setShellStyle(getShellStyle() | SWT.RESIZE | SWT.MAX);
fView = view;
}
@Override
protected Control createDialogArea(Composite parent) {
getShell().setText(TracepointsMessages.TraceControlView_trace_variable_details_dialog_title);
Composite composite = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(1, false);
composite.setLayout(gridLayout);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
// Create the table to show the existing variables and their values
Composite tableComposite = new Composite(composite, SWT.NONE);
gridLayout = new GridLayout(1, false);
tableComposite.setLayout(gridLayout);
tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
table = new Table(tableComposite, SWT.BORDER | SWT.HIDE_SELECTION);
final GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
gridData.heightHint = 6 * table.getItemHeight();
table.setLayoutData(gridData);
table.setLinesVisible(true);
table.setHeaderVisible(true);
final TableColumn nameTableColumn = new TableColumn(table, SWT.NONE);
nameTableColumn.setWidth(150);
nameTableColumn.setText(TracepointsMessages.TraceControlView_trace_variable_details_column_name);
nameTableColumn.setAlignment(SWT.LEFT);
final TableColumn initValTableColumn = new TableColumn(table, SWT.NONE);
initValTableColumn.setWidth(120);
initValTableColumn.setText(TracepointsMessages.TraceControlView_trace_variable_details_column_init_value);
initValTableColumn.setAlignment(SWT.RIGHT);
final TableColumn currentValTableColumn = new TableColumn(table, SWT.NONE);
currentValTableColumn.setWidth(120);
currentValTableColumn.setText(TracepointsMessages.TraceControlView_trace_variable_details_column_curr_value);
currentValTableColumn.setAlignment(SWT.RIGHT);
refreshButton = new Button(tableComposite, SWT.NONE);
refreshButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
refreshButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleRefresh();
}
});
refreshButton.setText(TracepointsMessages.TraceControlView_trace_variable_details_refresh_button);
refreshButton.setEnabled(true);
Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
separator.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
// Create the section to create a new variable
Composite createComposite = new Composite(composite, SWT.NONE);
gridLayout = new GridLayout(1, false);
createComposite.setLayout(gridLayout);
createComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
// Now a composite just for the input
Composite inputComposite = new Composite(createComposite, SWT.NONE);
gridLayout = new GridLayout(2, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
inputComposite.setLayout(gridLayout);
inputComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
Label nameLabel = new Label(inputComposite, SWT.NONE);
nameLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
nameLabel.setText(TracepointsMessages.TraceControlView_trace_variable_details_name_label);
nameInput = new Text(inputComposite, SWT.BORDER);
nameInput.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
Label valueLabel = new Label(inputComposite, SWT.NONE);
valueLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
valueLabel.setText(TracepointsMessages.TraceControlView_trace_variable_details_value_label);
valueInput = new Text(inputComposite, SWT.BORDER);
valueInput.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
// And a composite for the create button and its warning icon and text
Composite createButtonComposite = new Composite(createComposite, SWT.NONE);
gridLayout = new GridLayout(3, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
createButtonComposite.setLayout(gridLayout);
createButtonComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
createButton = new Button(createButtonComposite, SWT.NONE);
createButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
createButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleCreate();
}
});
createButton.setText(TracepointsMessages.TraceControlView_trace_variable_details_create_button);
createButton.setEnabled(true);
warningIconLabel = new Label(createButtonComposite, SWT.NONE);
warningIconLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
warningImage = ResourceLocator.imageDescriptorFromBundle(GdbUIPlugin.PLUGIN_ID, "icons/full/obj16/warning.gif") //$NON-NLS-1$
.get().createImage();
warningIconLabel.setImage(warningImage);
warningIconLabel.setVisible(false);
warningTextLabel = new Label(createButtonComposite, SWT.NONE);
warningTextLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
parent.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (warningImage != null)
warningImage.dispose();
}
});
// When the user goes into either input field, then pressing return
// should try to create the command
FocusListener clearWarningFocusListener = new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
getShell().setDefaultButton(createButton);
}
@Override
public void focusLost(FocusEvent e) {
}
};
nameInput.addFocusListener(clearWarningFocusListener);
valueInput.addFocusListener(clearWarningFocusListener);
// When the user modifies any entry in the input, we should clear any warning
ModifyListener clearWarningListener = new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
setWarningVisible(false);
}
};
nameInput.addModifyListener(clearWarningListener);
valueInput.addModifyListener(clearWarningListener);
resetInputFields();
handleRefresh();
return composite;
}
/**
* Set the visibility of the warning. Should be set to true when there
* is a problem creating the specific variable; false otherwise
*
* @param visible
* True for visible, false for hidden.
*/
public void setWarningVisible(boolean visible) {
if (warningIconLabel == null)
return;
warningIconLabel.setVisible(visible);
if (visible == false) {
if (warningTextLabel != null) {
warningTextLabel.setText(""); //$NON-NLS-1$
}
}
}
/**
* Set the visibility of the warning icon to true and set its
* text to the parameter message.
*/
public void setWarningVisible(String message) {
if (warningIconLabel == null || warningTextLabel == null)
return;
warningTextLabel.setText(message);
warningIconLabel.setVisible(true);
nameInput.setFocus();
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
// create Close button only
createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, true);
}
@Override
protected void buttonPressed(int buttonId) {
if (IDialogConstants.CLOSE_ID == buttonId) {
close();
}
}
protected void handleRefresh() {
ITraceVariableDMData[] vars = fView.fTraceControlModel.getTraceVarList();
if (vars == null) {
setWarningVisible(TracepointsMessages.TraceControlView_refresh_variable_error);
createButton.setEnabled(false);
return;
}
// Remove the warning and re-enable the create button, since we now
// have a list of trace variables.
setWarningVisible(false);
createButton.setEnabled(true);
table.removeAll();
for (ITraceVariableDMData var : vars) {
String currentVal = var.getValue();
if (currentVal == null) {
currentVal = ""; //$NON-NLS-1$
}
addTableItem(var.getName(), var.getInitialValue(), currentVal);
}
}
private void addTableItem(String name, String initVal, String currentVal) {
// Find where to insert the new element
int index = -1;
TableItem[] items = table.getItems();
Collator collator = Collator.getInstance(Locale.getDefault());
for (int i = 0; i < items.length; i++) {
String rowName = items[i].getText(0);
if (collator.compare(name, rowName) < 0) {
index = i;
break;
}
}
if (index == -1) {
index = items.length;
}
TableItem tableItem = new TableItem(table, SWT.NONE, index);
tableItem.setText(0, name);
tableItem.setText(1, initVal);
tableItem.setText(2, currentVal);
}
protected void resetInputFields() {
nameInput.setText(""); //$NON-NLS-1$
valueInput.setText("0"); //$NON-NLS-1$
}
protected void handleCreate() {
String name = nameInput.getText();
if (name != null && !name.isEmpty()) {
String value = valueInput.getText();
if (value != null && value.length() == 0) {
value = null; // No value specified
}
try {
fView.fTraceControlModel.createVariable(name, value);
resetInputFields();
nameInput.setFocus();
handleRefresh();
} catch (FailedTraceVariableCreationException e) {
setWarningVisible(e.getMessage());
}
} else {
setWarningVisible(TracepointsMessages.TraceControlView_create_variable_empty_name_error);
}
}
}