]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling/src/org/simantics/modeling/adapters/RemoveInstancesDialog.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / adapters / RemoveInstancesDialog.java
diff --git a/bundles/org.simantics.modeling/src/org/simantics/modeling/adapters/RemoveInstancesDialog.java b/bundles/org.simantics.modeling/src/org/simantics/modeling/adapters/RemoveInstancesDialog.java
new file mode 100644 (file)
index 0000000..f1e4936
--- /dev/null
@@ -0,0 +1,255 @@
+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