| /********************************************************************** |
| * Copyright (c) 2019 Draeger, Auriga |
| * |
| * All rights reserved. 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 |
| **********************************************************************/ |
| package org.eclipse.tracecompass.internal.tmf.ui.views; |
| |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.dialogs.IDialogConstants; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| 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.Text; |
| import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.AxisRange; |
| import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer; |
| import org.eclipse.tracecompass.tmf.ui.views.TmfChartView; |
| import org.swtchart.Range; |
| |
| /** |
| * Dialog box for entering minimum and maximum range for Y axis of |
| * {@link TmfChartView}. |
| * |
| * @author Ivan Grinenko |
| * |
| */ |
| public class LockRangeDialog extends Dialog { |
| /** |
| * Checkbox to lock or unlock the axis. |
| */ |
| private Button fCheck; |
| /** |
| * Text field for minimum. |
| */ |
| private Text fMinText; |
| /** |
| * Text field for maximum. |
| */ |
| private Text fMaxText; |
| /** |
| * Viewer with Y axis to lock. |
| */ |
| private final TmfXYChartViewer fChartViewer; |
| /** |
| * ModifyListener for the text inputs. |
| */ |
| private ModifyListener fModifyListener = e -> validateInputs(); |
| |
| private static boolean isValidDouble(String input) { |
| try { |
| Double.parseDouble(input); |
| } catch (NumberFormatException e) { |
| return false; |
| } |
| return true; |
| } |
| |
| /** |
| * Constructor. |
| * |
| * @param parentShell |
| * parent shell |
| * @param chartViewer |
| * viewer with Y axis to lock |
| */ |
| public LockRangeDialog(Shell parentShell, TmfXYChartViewer chartViewer) { |
| super(parentShell); |
| fChartViewer = chartViewer; |
| } |
| |
| @Override |
| protected Control createDialogArea(Composite p) { |
| p.getShell().setText(Messages.TmfChartView_LockYAxis); |
| Composite parent = (Composite) super.createDialogArea(p); |
| |
| GridLayout parentLayout = new GridLayout(2, false); |
| parent.setLayout(parentLayout); |
| |
| Range range = fChartViewer.getSwtChart().getAxisSet().getYAxis(0).getRange(); |
| |
| fCheck = new Button(parent, SWT.CHECK); |
| fCheck.setText(Messages.TmfChartView_LockButton); |
| fCheck.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1)); |
| fCheck.setSelection(true); |
| fCheck.addSelectionListener(new SelectionListener() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| fMinText.setEnabled(fCheck.getSelection()); |
| fMaxText.setEnabled(fCheck.getSelection()); |
| validateInputs(); |
| } |
| |
| @Override |
| public void widgetDefaultSelected(SelectionEvent e) { |
| // nothing to do |
| } |
| }); |
| |
| Label minLabel = new Label(parent, SWT.RADIO); |
| minLabel.setText(Messages.TmfChartView_LowerYAxisRange); |
| minLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); |
| |
| fMinText = new Text(parent, SWT.SINGLE | SWT.BORDER); |
| fMinText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); |
| fMinText.setText(String.valueOf(range.lower)); |
| fMinText.addModifyListener(fModifyListener); |
| |
| Label maxLabel = new Label(parent, SWT.RADIO); |
| maxLabel.setText(Messages.TmfChartView_UpperYAxisRange); |
| maxLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); |
| |
| fMaxText = new Text(parent, SWT.SINGLE | SWT.BORDER); |
| fMaxText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); |
| fMaxText.setText(String.valueOf(range.upper)); |
| fMaxText.addModifyListener(fModifyListener); |
| |
| return parent; |
| } |
| |
| @Override |
| protected void okPressed() { |
| if (fCheck.getSelection()) { |
| lockAxis(); |
| } else { |
| fChartViewer.setFixedYRange(null); |
| } |
| super.okPressed(); |
| } |
| |
| private void lockAxis() { |
| double min = 0; |
| double max = 0; |
| try { |
| min = Double.parseDouble(fMinText.getText()); |
| max = Double.parseDouble(fMaxText.getText()); |
| fChartViewer.setFixedYRange(new AxisRange(min, max)); |
| } catch (NumberFormatException e) { |
| // Suppose values are already validated |
| } |
| } |
| |
| /** |
| * OK is enabled only if both of text inputs contain valid doubles or the |
| * checkbox is unchecked. |
| */ |
| private void validateInputs() { |
| boolean isValidInput = isValidDouble(fMaxText.getText()) && isValidDouble(fMinText.getText()); |
| getButton(IDialogConstants.OK_ID).setEnabled(isValidInput || !fCheck.getSelection()); |
| } |
| |
| } |