blob: 36905f9fba87f647aabe3a2ed0da8e6744f1c0cd [file] [log] [blame]
/**
* Copyright (c) 2019 CEA.
* 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
*
* Contributors:
* CEA - initial API and implementation and/or initial documentation
*/
package org.eclipse.sensinact.studio.ui.common.widget;
import java.util.Comparator;
import java.util.List;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
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.Shell;
import org.eclipse.swt.widgets.Text;
/**
* A simple list<String> editor, with an add an a remove button.
*
* @author Etienne Gandrille
*/
public class ListEditor extends AbstractEditor {
private List<String> model;
private Text text;
private IInputValidator validator = null;
/**
* Constructor.
*
* @param parent
* the parent composite.
* @param model
* the input, which can be an empty list, but mustn't be null.
*/
public ListEditor(Composite parent, List<String> model) {
super(parent);
this.model = model;
// Composite
widgetComposite = new Composite(parent, SWT.NONE);
widgetComposite.setLayout(new GridLayout(2, false));
// Text
text = new Text(widgetComposite, SWT.BORDER);
text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
// Add Button
final Button btnAdd = new Button(widgetComposite, SWT.NONE);
btnAdd.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
btnAdd.setText(addLabel);
// JFace List Viewer
jFaceViewer = new ListViewer(widgetComposite, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
jFaceViewer.setContentProvider(new ArrayContentProvider());
jFaceViewer.setLabelProvider(new LabelProvider());
jFaceViewer.setInput(model);
jFaceViewer.setComparator(getDefaultComparator());
jFaceViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
// Remove Button
final Button btnRemove = new Button(widgetComposite, SWT.NONE);
btnRemove.setText(removeLabel);
btnRemove.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
// Listeners
btnAdd.addMouseListener(new AddButtonListener(shell, text, jFaceViewer));
btnRemove.addMouseListener(new RemoveButtonListener(shell, jFaceViewer));
}
public void setValidator(IInputValidator validator) {
this.validator = validator;
}
private class AddButtonListener implements MouseListener {
private Text text;
private Shell shell;
private StructuredViewer list;
public AddButtonListener(Shell shell, Text text, StructuredViewer list) {
this.shell = shell;
this.text = text;
this.list = list;
}
@Override
public void mouseDoubleClick(MouseEvent e) {
}
@Override
public void mouseDown(MouseEvent e) {
}
@Override
public void mouseUp(MouseEvent e) {
String str = text.getText().trim();
if (str.isEmpty()) {
displayError("Can't add an empty string");
return;
}
if (model.contains(str)) {
displayError("\"" + str + "\"" + " is already in the list.");
return;
}
if (validator != null) {
String msg = validator.isValid(str);
if (msg != null) {
displayError(msg);
return;
}
}
model.add(str);
list.refresh();
text.setText("");
text.setFocus();
}
void displayError(String message) {
MessageDialog.openError(shell, "Error", message);
}
}
/**
* Listener called when clicking on the remove button.
*/
private class RemoveButtonListener implements MouseListener {
private Shell shell;
private StructuredViewer list;
public RemoveButtonListener(Shell shell, StructuredViewer list) {
this.shell = shell;
this.list = list;
}
@Override
public void mouseDoubleClick(MouseEvent e) {
}
@Override
public void mouseDown(MouseEvent e) {
}
@Override
public void mouseUp(MouseEvent e) {
StructuredSelection sel = (StructuredSelection) list.getSelection();
String str = (String) sel.getFirstElement();
if (str == null)
MessageDialog.openError(shell, "Error", "Please select an element first.");
else
model.remove(str);
list.refresh();
}
}
@Override
public void refresh() {
}
@Override
protected ViewerComparator getDefaultComparator() {
return new ViewerComparator(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.toUpperCase().compareTo(o2.toUpperCase());
}
});
}
}