--- /dev/null
+package org.simantics.utils.ui.dialogs;\r
+\r
+import java.util.Collection;\r
+\r
+import org.eclipse.jface.dialogs.Dialog;\r
+import org.eclipse.jface.dialogs.IDialogSettings;\r
+import org.eclipse.jface.viewers.ArrayContentProvider;\r
+import org.eclipse.jface.viewers.LabelProvider;\r
+import org.eclipse.jface.viewers.StructuredViewer;\r
+import org.eclipse.jface.viewers.TableViewer;\r
+import org.eclipse.jface.viewers.Viewer;\r
+import org.eclipse.jface.viewers.ViewerSorter;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.graphics.Point;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.swt.widgets.Control;\r
+import org.eclipse.swt.widgets.Label;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.simantics.utils.strings.AlphanumComparator;\r
+import org.simantics.utils.ui.internal.Activator;\r
+\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class ListDialog<T> extends Dialog {\r
+\r
+ private static final String DIALOG = "ListDialog"; //$NON-NLS-1$\r
+\r
+ private final Collection<T> selectables;\r
+\r
+ private final String title;\r
+\r
+ private final String description;\r
+\r
+ private StructuredViewer viewer;\r
+\r
+ private IDialogSettings dialogBoundsSettings;\r
+\r
+ public ListDialog(Shell parent, Collection<T> selectables, String title, String description) {\r
+ super(parent);\r
+ this.selectables = selectables;\r
+ this.title = title;\r
+ this.description = description;\r
+\r
+ IDialogSettings settings = Activator.getDefault().getDialogSettings();\r
+ dialogBoundsSettings = settings.getSection(DIALOG);\r
+ if (dialogBoundsSettings == null)\r
+ dialogBoundsSettings = settings.addNewSection(DIALOG);\r
+ }\r
+\r
+ @Override\r
+ protected IDialogSettings getDialogBoundsSettings() {\r
+ return dialogBoundsSettings;\r
+ }\r
+\r
+ @Override\r
+ protected void configureShell(Shell newShell) {\r
+ if (title != null) {\r
+ newShell.setText(title);\r
+ } else {\r
+ newShell.setText("Select");\r
+ }\r
+ super.configureShell(newShell);\r
+ }\r
+\r
+ @Override\r
+ protected int getShellStyle() {\r
+ return super.getShellStyle() | SWT.RESIZE;\r
+ }\r
+\r
+ @Override\r
+ protected Point getInitialSize() {\r
+ Point defaultSize = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT, true);\r
+ Point result = super.getInitialSize();\r
+ if (defaultSize.equals(result))\r
+ return new Point(500, 300);\r
+ return result;\r
+ }\r
+ \r
+ protected StructuredViewer createViewer(Composite composite) {\r
+ return new TableViewer(composite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);\r
+ }\r
+\r
+ @Override\r
+ protected Control createDialogArea(Composite parent) {\r
+ Composite composite = (Composite) super.createDialogArea(parent);\r
+\r
+ if (description != null) {\r
+ Label label = new Label(composite, 0);\r
+ label.setText(description);\r
+ label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));\r
+ }\r
+\r
+ viewer = createViewer(composite);\r
+ viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));\r
+ viewer.setContentProvider(new ArrayContentProvider());\r
+ viewer.setLabelProvider(new SelectableLabelProvider());\r
+ viewer.setSorter(sorter);\r
+ viewer.setInput(selectables);\r
+\r
+ applyDialogFont(composite);\r
+ return composite;\r
+ }\r
+\r
+ @Override\r
+ protected void okPressed() {\r
+ super.okPressed();\r
+ }\r
+\r
+ private String toLabel(T t) {\r
+ return t.toString();\r
+ }\r
+\r
+ private final ViewerSorter sorter = new ViewerSorter() {\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public int compare(Viewer viewer, Object e1, Object e2) {\r
+ return AlphanumComparator.CASE_INSENSITIVE_COMPARATOR.compare(toLabel((T) e1), toLabel((T) e2));\r
+ }\r
+ };\r
+\r
+ class SelectableLabelProvider extends LabelProvider {\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public String getText(Object element) {\r
+ return toLabel((T) element);\r
+ }\r
+ }\r
+\r
+}\r