]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.modeling.adapters;\r
2 \r
3 import org.eclipse.jface.dialogs.IDialogConstants;\r
4 import org.eclipse.jface.dialogs.MessageDialog;\r
5 import org.eclipse.jface.layout.GridDataFactory;\r
6 import org.eclipse.jface.layout.GridLayoutFactory;\r
7 import org.eclipse.jface.layout.TableColumnLayout;\r
8 import org.eclipse.jface.resource.ImageDescriptor;\r
9 import org.eclipse.jface.resource.JFaceResources;\r
10 import org.eclipse.jface.resource.LocalResourceManager;\r
11 import org.eclipse.jface.viewers.ColumnLabelProvider;\r
12 import org.eclipse.jface.viewers.ColumnWeightData;\r
13 import org.eclipse.jface.viewers.ISelectionChangedListener;\r
14 import org.eclipse.jface.viewers.IStructuredContentProvider;\r
15 import org.eclipse.jface.viewers.IStructuredSelection;\r
16 import org.eclipse.jface.viewers.SelectionChangedEvent;\r
17 import org.eclipse.jface.viewers.TableViewer;\r
18 import org.eclipse.jface.viewers.TableViewerColumn;\r
19 import org.eclipse.jface.viewers.Viewer;\r
20 import org.eclipse.swt.SWT;\r
21 import org.eclipse.swt.dnd.Clipboard;\r
22 import org.eclipse.swt.dnd.TextTransfer;\r
23 import org.eclipse.swt.dnd.Transfer;\r
24 import org.eclipse.swt.events.SelectionAdapter;\r
25 import org.eclipse.swt.events.SelectionEvent;\r
26 import org.eclipse.swt.graphics.Color;\r
27 import org.eclipse.swt.graphics.Image;\r
28 import org.eclipse.swt.layout.GridData;\r
29 import org.eclipse.swt.widgets.Button;\r
30 import org.eclipse.swt.widgets.Composite;\r
31 import org.eclipse.swt.widgets.Control;\r
32 import org.eclipse.swt.widgets.Label;\r
33 import org.eclipse.swt.widgets.Shell;\r
34 import org.eclipse.swt.widgets.Text;\r
35 import org.simantics.utils.strings.EString;\r
36 \r
37 /**\r
38  * @author Tuukka Lehtonen\r
39  */\r
40 public class RemoveInstancesDialog extends MessageDialog {\r
41 \r
42         public static class Content {\r
43                 public String label;\r
44                 public ImageDescriptor image;\r
45                 public String details;\r
46 \r
47                 public Content(String label) {\r
48                         assert label != null;\r
49                         this.label = label;\r
50                 }\r
51 \r
52                 @Override\r
53                 public String toString() {\r
54                         if (details == null)\r
55                                 return label;\r
56                         return label + "\nDetails: " + details;\r
57                 }\r
58         }\r
59 \r
60         protected String message;\r
61         protected boolean hasDetails; \r
62 \r
63         protected Content[] content;\r
64 \r
65         protected LocalResourceManager resourceManager;\r
66         protected Composite tableAndButtons;\r
67         protected Text messageText;\r
68         protected Text detailsText;\r
69         private GridData detailsGridData;\r
70 \r
71         public RemoveInstancesDialog(Shell parentShell, String dialogTitle, String dialogMessage, Content[] content) {\r
72                 this(parentShell,\r
73                                 dialogTitle,\r
74                                 dialogMessage,\r
75                                 MessageDialog.QUESTION,\r
76                                 new String[] {\r
77                                         IDialogConstants.PROCEED_LABEL,\r
78                                         IDialogConstants.CANCEL_LABEL\r
79                                 },\r
80                                 1,\r
81                                 content);\r
82         }\r
83 \r
84         public RemoveInstancesDialog(Shell parentShell, String dialogTitle, String dialogMessage, int dialogType, String[] buttons, int defaultIndex, Content[] content) {\r
85                 super(parentShell,\r
86                                 dialogTitle,\r
87                                 null,\r
88                                 null,\r
89                                 dialogType,\r
90                                 buttons,\r
91                                 defaultIndex);\r
92 \r
93                 this.message = dialogMessage;\r
94                 this.content = content;\r
95                 this.hasDetails = contentHasDetails(content);\r
96         }\r
97 \r
98         private boolean contentHasDetails(Content[] content) {\r
99                 for (Content c : content) {\r
100                         if (c.details != null && !c.details.trim().isEmpty())\r
101                                 return true;\r
102                 }\r
103                 return false;\r
104         }\r
105 \r
106         @Override\r
107         protected int getShellStyle() {\r
108                 return super.getShellStyle() | SWT.RESIZE;\r
109         }\r
110 \r
111         @Override\r
112         protected Control createDialogArea(Composite parent) {\r
113                 resourceManager = new LocalResourceManager(JFaceResources.getResources(), parent);\r
114                 Composite composite = (Composite) super.createDialogArea(parent);\r
115                 return composite;\r
116         }\r
117 \r
118         @Override\r
119         protected Control createMessageArea(Composite composite) {\r
120                 super.createMessageArea(composite);\r
121                 // create message\r
122                 if (message != null) {\r
123                         messageText = new Text(composite, getMessageLabelStyle());\r
124                         messageText.setText(message);\r
125                         messageText.setEditable(false);\r
126                         GridDataFactory\r
127                                         .fillDefaults()\r
128                                         .align(SWT.FILL, SWT.BEGINNING)\r
129                                         .grab(true, false)\r
130                                         .hint(\r
131                                                         convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH),\r
132                                                         SWT.DEFAULT).applyTo(messageText);\r
133                 }\r
134                 return composite;\r
135         }\r
136 \r
137         @Override\r
138         protected Control createCustomArea(Composite parent) {\r
139                 tableAndButtons = new Composite(parent, 0);\r
140                 GridDataFactory.fillDefaults().grab(true, true).applyTo(tableAndButtons);\r
141                 GridLayoutFactory.fillDefaults().numColumns(2).applyTo(tableAndButtons);\r
142 \r
143                 Label uses = new Label(tableAndButtons, 0);\r
144                 uses.setText("Instances:");\r
145                 GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(uses);\r
146 \r
147                 TableColumnLayout ad = new TableColumnLayout();\r
148                 Composite tableComposite = new Composite(tableAndButtons, SWT.NONE);\r
149                 GridDataFactory.fillDefaults().grab(true, true).minSize(300, 300).applyTo(tableComposite);\r
150                 tableComposite.setLayout(ad);\r
151                 TableViewer viewer = new TableViewer(tableComposite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);\r
152                 viewer.setContentProvider(new CP());\r
153                 TableViewerColumn c1 = new TableViewerColumn(viewer, SWT.LEFT);\r
154                 c1.setLabelProvider(new LP());\r
155                 ad.setColumnData(c1.getColumn(), new ColumnWeightData(100, 100, true));\r
156 \r
157                 Composite buttons = new Composite(tableAndButtons, 0);\r
158                 GridDataFactory.fillDefaults().grab(false, true).applyTo(buttons);\r
159                 GridLayoutFactory.fillDefaults().numColumns(1).applyTo(buttons);\r
160 \r
161                 Button copyButton = new Button(buttons, SWT.PUSH);\r
162                 copyButton.setText("&Copy to Clipboard");\r
163                 copyButton.setToolTipText("Copy List Contents to Clipboard");\r
164                 copyButton.addSelectionListener(new SelectionAdapter() {\r
165                         @Override\r
166                         public void widgetSelected(SelectionEvent e) {\r
167                                 String text = EString.implode(content, String.format("%n"));\r
168                                 Clipboard cp = new Clipboard(e.display);\r
169                                 cp.setContents(new Object[] { text }, new Transfer[] { TextTransfer.getInstance() });\r
170                                 cp.dispose();\r
171                         }\r
172                 });\r
173 \r
174 //              Button navigateButton = new Button(buttons, SWT.PUSH);\r
175 //              navigateButton.setText("Go To");\r
176 //              navigateButton.setToolTipText("Go To Selected Instances");\r
177 \r
178                 detailsText = new Text(tableAndButtons, SWT.BORDER | SWT.WRAP | SWT.MULTI | SWT.V_SCROLL);\r
179                 Color bg = detailsText.getBackground();\r
180                 detailsText.setEditable(false);\r
181                 detailsText.setBackground(bg);\r
182                 detailsGridData = GridDataFactory.fillDefaults().grab(true, false).hint(SWT.DEFAULT, 100).span(2, 1).create();\r
183                 detailsText.setLayoutData(detailsGridData);\r
184 \r
185                 viewer.addSelectionChangedListener(new ISelectionChangedListener() {\r
186                         @Override\r
187                         public void selectionChanged(SelectionChangedEvent event) {\r
188                                 IStructuredSelection sel = (IStructuredSelection) event.getSelection();\r
189                                 Content content = (Content)(sel.getFirstElement());\r
190                                 showDetails(content);\r
191                         }\r
192                 });\r
193                 viewer.setInput(content);\r
194 \r
195                 detailsText.getDisplay().asyncExec(new Runnable() {\r
196                         @Override\r
197                         public void run() {\r
198                                 showDetails(null);\r
199                         }\r
200                 });\r
201                 return tableAndButtons;\r
202         }\r
203 \r
204         protected void showDetails(Content content) {\r
205                 if (detailsText == null || detailsText.isDisposed())\r
206                         return;\r
207                 if (content != null && content.details != null) {\r
208                         detailsText.setText(content.details);\r
209                         if (detailsGridData.exclude) {\r
210                                 detailsGridData.exclude = false;\r
211                                 detailsGridData.heightHint = 100;\r
212                                 tableAndButtons.layout(true, true);\r
213                         }\r
214                 } else {\r
215                         detailsText.setText("");\r
216                         if (!detailsGridData.exclude) {\r
217                                 detailsGridData.exclude = true;\r
218                                 detailsGridData.heightHint = 0;\r
219                                 detailsText.setSize(0, 0);\r
220                                 tableAndButtons.layout(true, true);\r
221                         }\r
222                 }\r
223         }\r
224 \r
225         protected class CP implements IStructuredContentProvider {\r
226 \r
227                 @Override\r
228                 public void dispose() {\r
229                 }\r
230 \r
231                 @Override\r
232                 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
233                 }\r
234 \r
235                 @Override\r
236                 public Object[] getElements(Object inputElement) {\r
237                         return content;\r
238                 }\r
239 \r
240         }\r
241 \r
242         protected class LP extends ColumnLabelProvider {\r
243                 @Override\r
244                 public Image getImage(Object element) {\r
245                         Content content = (Content) element;\r
246                         return content.image != null ? (Image) resourceManager.get(content.image) : null;\r
247                 }\r
248                 @Override\r
249                 public String getText(Object element) {\r
250                         Content content = (Content) element;\r
251                         return content.label;\r
252                 }\r
253         }\r
254 \r
255 }\r