package name.abuchen.portfolio.ui.dialogs; import java.util.List; import java.util.regex.Pattern; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; 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.Text; public class ListSelectionDialog extends Dialog { private class ElementFilter extends ViewerFilter { private Pattern filterPattern; public void setSearchPattern(String pattern) { if (pattern != null) filterPattern = Pattern.compile(".*" + pattern + ".*", Pattern.CASE_INSENSITIVE); //$NON-NLS-1$ //$NON-NLS-2$ else filterPattern = null; } @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (filterPattern == null) return true; String text = labelProvider.getText(element); if (text == null) return false; return filterPattern.matcher(text).matches(); } } private LabelProvider labelProvider; private String title; private String message = ""; //$NON-NLS-1$ private boolean isMultiSelection = true; private Object[] elements; private Object[] selected; private TableViewer tableViewer; private ElementFilter elementFilter; private Text searchText; public ListSelectionDialog(Shell parentShell, LabelProvider labelProvider) { super(parentShell); this.labelProvider = labelProvider; } public void setTitle(String title) { this.title = title; } public void setMessage(String message) { this.message = message; } public void setMultiSelection(boolean isMultiSelection) { this.isMultiSelection = isMultiSelection; } public void setElements(List<?> elements) { this.elements = elements.toArray(); } public Object[] getResult() { return selected; } @Override protected void setShellStyle(int newShellStyle) { super.setShellStyle(newShellStyle | SWT.RESIZE); } @Override protected Control createContents(Composite parent) { Control contents = super.createContents(parent); getShell().setText(title); return contents; } @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); Composite container = new Composite(composite, SWT.None); GridDataFactory.fillDefaults().grab(true, true).hint(400, 300).applyTo(container); GridLayoutFactory.fillDefaults().numColumns(1).applyTo(container); Label label = new Label(container, SWT.None); label.setText(this.message); GridDataFactory.fillDefaults().grab(true, false).applyTo(label); searchText = new Text(container, SWT.BORDER); GridDataFactory.fillDefaults().grab(true, false).applyTo(searchText); searchText.setFocus(); Composite tableArea = new Composite(container, SWT.NONE); GridDataFactory.fillDefaults().grab(false, true).applyTo(tableArea); tableArea.setLayout(new FillLayout()); TableColumnLayout layout = new TableColumnLayout(); tableArea.setLayout(layout); elementFilter = new ElementFilter(); int style = SWT.BORDER | SWT.FULL_SELECTION; if (isMultiSelection) style |= SWT.MULTI; tableViewer = new TableViewer(tableArea, style); final Table table = tableViewer.getTable(); table.setHeaderVisible(false); table.setLinesVisible(false); TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.None); layout.setColumnData(column.getColumn(), new ColumnWeightData(100)); tableViewer.setLabelProvider(labelProvider); tableViewer.setContentProvider(ArrayContentProvider.getInstance()); tableViewer.addFilter(elementFilter); tableViewer.setInput(elements); tableViewer.setComparator(new ViewerComparator()); hookListener(); return composite; } private void hookListener() { tableViewer.addSelectionChangedListener( event -> selected = ((IStructuredSelection) event.getSelection()).toArray()); tableViewer.addDoubleClickListener(event -> { selected = ((IStructuredSelection) event.getSelection()).toArray(); okPressed(); }); searchText.addModifyListener(e -> { String pattern = searchText.getText().trim(); if (pattern.length() == 0) { elementFilter.setSearchPattern(null); tableViewer.refresh(); } else { elementFilter.setSearchPattern(pattern); tableViewer.refresh(); } }); } }