/******************************************************************************* * Copyright (c) 2015, 2016 EfficiOS Inc., Philippe Proulx * * 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 *******************************************************************************/ package org.eclipse.tracecompass.internal.provisional.analysis.lami.ui.handler; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IInputValidator; import org.eclipse.jface.resource.FontDescriptor; import org.eclipse.jface.resource.StringConverter; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; 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.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; /** * Dialog to set a name and a command when creating a custom * analysis entry. * * @author Philippe Proulx */ @NonNullByDefault({}) class AddAnalysisDialog extends Dialog { private final String title; private String fName = ""; //$NON-NLS-1$ private String fCommand = ""; //$NON-NLS-1$ private final IInputValidator fNameValidator; private final IInputValidator fCommandValidator; private Button fOkButton; private Text fNameText; private Text fCommandText; private Label fNameErrorLabel; private Label fCommandErrorLabel; public AddAnalysisDialog(Shell parentShell, String dialogTitle, IInputValidator nameValidator, IInputValidator commandValidator) { super(parentShell); this.title = dialogTitle; fNameValidator = nameValidator; fCommandValidator = commandValidator; } @Override protected void buttonPressed(int buttonId) { if (buttonId == IDialogConstants.OK_ID) { fName = fNameText.getText(); fCommand = fCommandText.getText(); } else { fName = null; fCommand = null; } super.buttonPressed(buttonId); } @Override protected boolean isResizable() { return true; } @Override protected void configureShell(Shell shell) { super.configureShell(shell); if (title != null) { shell.setText(title); } } @Override protected void createButtonsForButtonBar(Composite parent) { fOkButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); validateInputs(); fNameText.setFocus(); } private static void createSubtitleLabel(Composite parent, String text) { final Label label = new Label(parent, SWT.WRAP); label.setText(text + ':'); final FontDescriptor boldDescriptor = FontDescriptor.createFrom(parent.getFont()).setStyle(SWT.BOLD); final Font boldFont = boldDescriptor.createFont(parent.getDisplay()); label.setFont(boldFont); label.addDisposeListener(event -> boldDescriptor.destroyFont(boldFont)); } private static Label createErrorLabel(Composite parent) { final Label label = new Label(parent, SWT.WRAP); Color color = new Color(parent.getDisplay(), 0xe7, 0x4c, 0x3c); label.setForeground(color); final FontDescriptor fd = FontDescriptor.createFrom(parent.getFont()); Font font = fd.createFont(parent.getDisplay()); label.setFont(font); label.addDisposeListener(e -> { color.dispose(); fd.destroyFont(font); }); return label; } @Override protected Control createDialogArea(Composite parent) { // create composite final Composite composite = (Composite) super.createDialogArea(parent); // create label for name text createSubtitleLabel(composite, Messages.AddAnalysisDialog_Name); // create name text fNameText = new Text(composite, getInputTextStyle()); fNameText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); fNameText.addModifyListener(e -> validateInputs()); // create name error text fNameErrorLabel = createErrorLabel(composite); // spacer new Label(composite, SWT.WRAP); // create label for command text createSubtitleLabel(composite, Messages.AddAnalysisDialog_Command); // create command text fCommandText = new Text(composite, getInputTextStyle()); fCommandText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); final Font mono = new Font(parent.getDisplay(), "Monospace", 9, SWT.NONE); //$NON-NLS-1$ fCommandText.setFont(mono); fCommandText.addModifyListener(e -> validateInputs()); fCommandText.addDisposeListener(e -> mono.dispose()); // create command error text fCommandErrorLabel = createErrorLabel(composite); applyDialogFont(composite); return composite; } @Override public void create() { super.create(); Shell shell = getShell(); shell.setMinimumSize(shell.getSize()); } /** * Returns the value of the name text. * * @return the name text's value */ public String getName() { return fName; } /** * Returns the value of the command text. * * @return the command text's value */ public String getCommand() { return fCommand; } protected boolean validateInput(IInputValidator validator, Text text, Label errorLabel) { final String errMsg = validator.isValid(text.getText()); setErrorLabel(errorLabel, errMsg); return errMsg == null; } protected void validateInputs() { boolean valid = true; valid &= validateInput(fNameValidator, fNameText, fNameErrorLabel); valid &= validateInput(fCommandValidator, fCommandText, fCommandErrorLabel); fOkButton.setEnabled(valid); } protected void setErrorLabel(Label label, String errorMessage) { if (label != null && !label.isDisposed()) { label.setText(errorMessage == null ? " \n " : errorMessage); //$NON-NLS-1$ final boolean hasError = errorMessage != null && (StringConverter.removeWhiteSpaces(errorMessage)).length() > 0; label.setEnabled(hasError); label.setVisible(hasError); label.getParent().update(); Control button = getButton(IDialogConstants.OK_ID); if (button != null) { button.setEnabled(errorMessage == null); } } } protected int getInputTextStyle() { return SWT.SINGLE | SWT.BORDER; } }