--- /dev/null
+package org.simantics.modeling.adapters;\r
+\r
+import org.eclipse.jface.dialogs.IDialogConstants;\r
+import org.eclipse.jface.dialogs.MessageDialog;\r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.jface.layout.GridLayoutFactory;\r
+import org.eclipse.jface.layout.TableColumnLayout;\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
+import org.eclipse.jface.resource.JFaceResources;\r
+import org.eclipse.jface.resource.LocalResourceManager;\r
+import org.eclipse.jface.viewers.ColumnLabelProvider;\r
+import org.eclipse.jface.viewers.ColumnWeightData;\r
+import org.eclipse.jface.viewers.ISelectionChangedListener;\r
+import org.eclipse.jface.viewers.IStructuredContentProvider;\r
+import org.eclipse.jface.viewers.IStructuredSelection;\r
+import org.eclipse.jface.viewers.SelectionChangedEvent;\r
+import org.eclipse.jface.viewers.TableViewer;\r
+import org.eclipse.jface.viewers.TableViewerColumn;\r
+import org.eclipse.jface.viewers.Viewer;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.dnd.Clipboard;\r
+import org.eclipse.swt.dnd.TextTransfer;\r
+import org.eclipse.swt.dnd.Transfer;\r
+import org.eclipse.swt.events.SelectionAdapter;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.graphics.Color;\r
+import org.eclipse.swt.graphics.Image;\r
+import org.eclipse.swt.layout.GridData;\r
+import org.eclipse.swt.widgets.Button;\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.eclipse.swt.widgets.Text;\r
+import org.simantics.utils.strings.EString;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public class RemoveInstancesDialog extends MessageDialog {\r
+\r
+ public static class Content {\r
+ public String label;\r
+ public ImageDescriptor image;\r
+ public String details;\r
+\r
+ public Content(String label) {\r
+ assert label != null;\r
+ this.label = label;\r
+ }\r
+\r
+ @Override\r
+ public String toString() {\r
+ if (details == null)\r
+ return label;\r
+ return label + "\nDetails: " + details;\r
+ }\r
+ }\r
+\r
+ protected String message;\r
+ protected boolean hasDetails; \r
+\r
+ protected Content[] content;\r
+\r
+ protected LocalResourceManager resourceManager;\r
+ protected Composite tableAndButtons;\r
+ protected Text messageText;\r
+ protected Text detailsText;\r
+ private GridData detailsGridData;\r
+\r
+ public RemoveInstancesDialog(Shell parentShell, String dialogTitle, String dialogMessage, Content[] content) {\r
+ this(parentShell,\r
+ dialogTitle,\r
+ dialogMessage,\r
+ MessageDialog.QUESTION,\r
+ new String[] {\r
+ IDialogConstants.PROCEED_LABEL,\r
+ IDialogConstants.CANCEL_LABEL\r
+ },\r
+ 1,\r
+ content);\r
+ }\r
+\r
+ public RemoveInstancesDialog(Shell parentShell, String dialogTitle, String dialogMessage, int dialogType, String[] buttons, int defaultIndex, Content[] content) {\r
+ super(parentShell,\r
+ dialogTitle,\r
+ null,\r
+ null,\r
+ dialogType,\r
+ buttons,\r
+ defaultIndex);\r
+\r
+ this.message = dialogMessage;\r
+ this.content = content;\r
+ this.hasDetails = contentHasDetails(content);\r
+ }\r
+\r
+ private boolean contentHasDetails(Content[] content) {\r
+ for (Content c : content) {\r
+ if (c.details != null && !c.details.trim().isEmpty())\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+ @Override\r
+ protected int getShellStyle() {\r
+ return super.getShellStyle() | SWT.RESIZE;\r
+ }\r
+\r
+ @Override\r
+ protected Control createDialogArea(Composite parent) {\r
+ resourceManager = new LocalResourceManager(JFaceResources.getResources(), parent);\r
+ Composite composite = (Composite) super.createDialogArea(parent);\r
+ return composite;\r
+ }\r
+\r
+ @Override\r
+ protected Control createMessageArea(Composite composite) {\r
+ super.createMessageArea(composite);\r
+ // create message\r
+ if (message != null) {\r
+ messageText = new Text(composite, getMessageLabelStyle());\r
+ messageText.setText(message);\r
+ messageText.setEditable(false);\r
+ GridDataFactory\r
+ .fillDefaults()\r
+ .align(SWT.FILL, SWT.BEGINNING)\r
+ .grab(true, false)\r
+ .hint(\r
+ convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH),\r
+ SWT.DEFAULT).applyTo(messageText);\r
+ }\r
+ return composite;\r
+ }\r
+\r
+ @Override\r
+ protected Control createCustomArea(Composite parent) {\r
+ tableAndButtons = new Composite(parent, 0);\r
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(tableAndButtons);\r
+ GridLayoutFactory.fillDefaults().numColumns(2).applyTo(tableAndButtons);\r
+\r
+ Label uses = new Label(tableAndButtons, 0);\r
+ uses.setText("Instances:");\r
+ GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(uses);\r
+\r
+ TableColumnLayout ad = new TableColumnLayout();\r
+ Composite tableComposite = new Composite(tableAndButtons, SWT.NONE);\r
+ GridDataFactory.fillDefaults().grab(true, true).minSize(300, 300).applyTo(tableComposite);\r
+ tableComposite.setLayout(ad);\r
+ TableViewer viewer = new TableViewer(tableComposite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);\r
+ viewer.setContentProvider(new CP());\r
+ TableViewerColumn c1 = new TableViewerColumn(viewer, SWT.LEFT);\r
+ c1.setLabelProvider(new LP());\r
+ ad.setColumnData(c1.getColumn(), new ColumnWeightData(100, 100, true));\r
+\r
+ Composite buttons = new Composite(tableAndButtons, 0);\r
+ GridDataFactory.fillDefaults().grab(false, true).applyTo(buttons);\r
+ GridLayoutFactory.fillDefaults().numColumns(1).applyTo(buttons);\r
+\r
+ Button copyButton = new Button(buttons, SWT.PUSH);\r
+ copyButton.setText("&Copy to Clipboard");\r
+ copyButton.setToolTipText("Copy List Contents to Clipboard");\r
+ copyButton.addSelectionListener(new SelectionAdapter() {\r
+ @Override\r
+ public void widgetSelected(SelectionEvent e) {\r
+ String text = EString.implode(content, String.format("%n"));\r
+ Clipboard cp = new Clipboard(e.display);\r
+ cp.setContents(new Object[] { text }, new Transfer[] { TextTransfer.getInstance() });\r
+ cp.dispose();\r
+ }\r
+ });\r
+\r
+// Button navigateButton = new Button(buttons, SWT.PUSH);\r
+// navigateButton.setText("Go To");\r
+// navigateButton.setToolTipText("Go To Selected Instances");\r
+\r
+ detailsText = new Text(tableAndButtons, SWT.BORDER | SWT.WRAP | SWT.MULTI | SWT.V_SCROLL);\r
+ Color bg = detailsText.getBackground();\r
+ detailsText.setEditable(false);\r
+ detailsText.setBackground(bg);\r
+ detailsGridData = GridDataFactory.fillDefaults().grab(true, false).hint(SWT.DEFAULT, 100).span(2, 1).create();\r
+ detailsText.setLayoutData(detailsGridData);\r
+\r
+ viewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
+ @Override\r
+ public void selectionChanged(SelectionChangedEvent event) {\r
+ IStructuredSelection sel = (IStructuredSelection) event.getSelection();\r
+ Content content = (Content)(sel.getFirstElement());\r
+ showDetails(content);\r
+ }\r
+ });\r
+ viewer.setInput(content);\r
+\r
+ detailsText.getDisplay().asyncExec(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ showDetails(null);\r
+ }\r
+ });\r
+ return tableAndButtons;\r
+ }\r
+\r
+ protected void showDetails(Content content) {\r
+ if (detailsText == null || detailsText.isDisposed())\r
+ return;\r
+ if (content != null && content.details != null) {\r
+ detailsText.setText(content.details);\r
+ if (detailsGridData.exclude) {\r
+ detailsGridData.exclude = false;\r
+ detailsGridData.heightHint = 100;\r
+ tableAndButtons.layout(true, true);\r
+ }\r
+ } else {\r
+ detailsText.setText("");\r
+ if (!detailsGridData.exclude) {\r
+ detailsGridData.exclude = true;\r
+ detailsGridData.heightHint = 0;\r
+ detailsText.setSize(0, 0);\r
+ tableAndButtons.layout(true, true);\r
+ }\r
+ }\r
+ }\r
+\r
+ protected class CP implements IStructuredContentProvider {\r
+\r
+ @Override\r
+ public void dispose() {\r
+ }\r
+\r
+ @Override\r
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
+ }\r
+\r
+ @Override\r
+ public Object[] getElements(Object inputElement) {\r
+ return content;\r
+ }\r
+\r
+ }\r
+\r
+ protected class LP extends ColumnLabelProvider {\r
+ @Override\r
+ public Image getImage(Object element) {\r
+ Content content = (Content) element;\r
+ return content.image != null ? (Image) resourceManager.get(content.image) : null;\r
+ }\r
+ @Override\r
+ public String getText(Object element) {\r
+ Content content = (Content) element;\r
+ return content.label;\r
+ }\r
+ }\r
+\r
+}\r