/**
*
*/
package org.goko.tools.serial.jssc.preferences.console;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
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.wb.swt.SWTResourceManager;
import org.goko.tools.serial.jssc.console.internal.JsscConsoleFilter;
import org.goko.tools.serial.jssc.console.internal.JsscConsoleFilterType;
/**
* @author Psyko
* @date 20 déc. 2016
*/
public class JsscConsoleFilterEditDialog extends Dialog {
private Text filterDescriptionText;
private Text filterPatternText;
private JsscConsoleFilter filter;
private Label errorLabel;
private Label descriptionErrorLabel;
private ComboViewer filterTypeCombo;
/**
* Create the dialog.
* @param parentShell
*/
public JsscConsoleFilterEditDialog(Shell parentShell) {
super(parentShell);
setShellStyle(SWT.BORDER | SWT.RESIZE | SWT.TITLE | SWT.APPLICATION_MODAL);
parentShell.setText("Edit filter");
}
void setFilter(JsscConsoleFilter filter){
this.filter = filter;
}
/**
* Create contents of the dialog.
* @param parent
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
GridLayout gridLayout = (GridLayout) container.getLayout();
gridLayout.verticalSpacing = 3;
gridLayout.marginWidth = 5;
gridLayout.marginHeight = 5;
Label lblDescription = new Label(container, SWT.NONE);
lblDescription.setText("Description");
filterDescriptionText = new Text(container, SWT.BORDER);
filterDescriptionText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
boolean validState = false;
if(StringUtils.isEmpty(filterDescriptionText.getText())){
descriptionErrorLabel.setText("A description is required");
validState = false;
}else{
descriptionErrorLabel.setText(StringUtils.EMPTY);
validState = true;
}
if(getButton(IDialogConstants.OK_ID) != null){
getButton(IDialogConstants.OK_ID).setEnabled(validState);
}
}
});
filterDescriptionText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
descriptionErrorLabel = new Label(container, SWT.NONE);
descriptionErrorLabel.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
Label lblPattern = new Label(container, SWT.NONE);
lblPattern.setText("Pattern");
filterPatternText = new Text(container, SWT.BORDER);
filterPatternText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
boolean validState = false;
if(StringUtils.isEmpty(filterPatternText.getText())){
errorLabel.setText(StringUtils.EMPTY);
validState = true;
}else{
try{
Pattern.compile(filterPatternText.getText());
errorLabel.setText(StringUtils.EMPTY);
validState = true;
}catch(PatternSyntaxException exception){
errorLabel.setText("Pattern is not a valid expression");
validState = false;
}
}
if(getButton(IDialogConstants.OK_ID) != null){
getButton(IDialogConstants.OK_ID).setEnabled(validState);
}
}
});
filterPatternText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
errorLabel = new Label(container, SWT.NONE);
errorLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
errorLabel.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
Label lblType = new Label(container, SWT.NONE);
lblType.setText("Type");
filterTypeCombo = new ComboViewer(container, SWT.READ_ONLY);
Combo combo = filterTypeCombo.getCombo();
combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
filterTypeCombo.setContentProvider(ArrayContentProvider.getInstance());
filterTypeCombo.setLabelProvider(new LabelProvider(){
/** (inheritDoc)
* @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
return ((JsscConsoleFilterType)element).getLabel();
}
});
filterTypeCombo.setInput(JsscConsoleFilterType.values());
if(filter != null){
filterDescriptionText.setText(filter.getDescription());
filterPatternText.setText(filter.getRegex());
filterTypeCombo.setSelection(new StructuredSelection(filter.getType()));
}
return container;
}
/**
* Create contents of the button bar.
* @param parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
/**
* Return the initial size of the dialog.
*/
@Override
protected Point getInitialSize() {
return new Point(433, 271);
}
/** (inheritDoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
@Override
protected void okPressed() {
if(filter != null){
filter.setDescription(filterDescriptionText.getText());
filter.setRegex(filterPatternText.getText());
filter.setType((JsscConsoleFilterType) filterTypeCombo.getStructuredSelection().getFirstElement());
}
super.okPressed();
}
}