1 package org.simantics.utils.ui.dialogs;
3 import java.util.Collection;
5 import org.eclipse.jface.dialogs.Dialog;
6 import org.eclipse.jface.dialogs.IDialogSettings;
7 import org.eclipse.jface.viewers.ArrayContentProvider;
8 import org.eclipse.jface.viewers.LabelProvider;
9 import org.eclipse.jface.viewers.StructuredViewer;
10 import org.eclipse.jface.viewers.TableViewer;
11 import org.eclipse.jface.viewers.Viewer;
12 import org.eclipse.jface.viewers.ViewerSorter;
13 import org.eclipse.swt.SWT;
14 import org.eclipse.swt.graphics.Point;
15 import org.eclipse.swt.layout.GridData;
16 import org.eclipse.swt.widgets.Composite;
17 import org.eclipse.swt.widgets.Control;
18 import org.eclipse.swt.widgets.Label;
19 import org.eclipse.swt.widgets.Shell;
20 import org.simantics.utils.strings.AlphanumComparator;
21 import org.simantics.utils.ui.internal.Activator;
25 * @author Tuukka Lehtonen
27 public class ListDialog<T> extends Dialog {
29 private static final String DIALOG = "ListDialog"; //$NON-NLS-1$
31 private final Collection<T> selectables;
33 private final String title;
35 private final String description;
37 private StructuredViewer viewer;
39 private IDialogSettings dialogBoundsSettings;
41 public ListDialog(Shell parent, Collection<T> selectables, String title, String description) {
43 this.selectables = selectables;
45 this.description = description;
47 IDialogSettings settings = Activator.getDefault().getDialogSettings();
48 dialogBoundsSettings = settings.getSection(DIALOG);
49 if (dialogBoundsSettings == null)
50 dialogBoundsSettings = settings.addNewSection(DIALOG);
54 protected IDialogSettings getDialogBoundsSettings() {
55 return dialogBoundsSettings;
59 protected void configureShell(Shell newShell) {
61 newShell.setText(title);
63 newShell.setText("Select");
65 super.configureShell(newShell);
69 protected int getShellStyle() {
70 return super.getShellStyle() | SWT.RESIZE;
74 protected Point getInitialSize() {
75 Point defaultSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
76 Point result = super.getInitialSize();
77 if (defaultSize.equals(result))
78 return new Point(500, 300);
82 protected StructuredViewer createViewer(Composite composite) {
83 return new TableViewer(composite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
87 protected Control createDialogArea(Composite parent) {
88 Composite composite = (Composite) super.createDialogArea(parent);
90 if (description != null) {
91 Label label = new Label(composite, 0);
92 label.setText(description);
93 label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
96 viewer = createViewer(composite);
97 viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
98 viewer.setContentProvider(new ArrayContentProvider());
99 viewer.setLabelProvider(new SelectableLabelProvider());
100 viewer.setSorter(sorter);
101 viewer.setInput(selectables);
103 applyDialogFont(composite);
108 protected void okPressed() {
112 private String toLabel(T t) {
116 private final ViewerSorter sorter = new ViewerSorter() {
117 @SuppressWarnings("unchecked")
119 public int compare(Viewer viewer, Object e1, Object e2) {
120 return AlphanumComparator.CASE_INSENSITIVE_COMPARATOR.compare(toLabel((T) e1), toLabel((T) e2));
124 class SelectableLabelProvider extends LabelProvider {
125 @SuppressWarnings("unchecked")
127 public String getText(Object element) {
128 return toLabel((T) element);