]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/imports/internal/ManageImportsDialog.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / imports / internal / ManageImportsDialog.java
1 package org.simantics.scl.ui.imports.internal;\r
2 \r
3 import gnu.trove.set.hash.THashSet;\r
4 \r
5 import java.util.ArrayList;\r
6 import java.util.Arrays;\r
7 import java.util.Collections;\r
8 \r
9 import org.eclipse.jface.dialogs.IDialogSettings;\r
10 import org.eclipse.jface.dialogs.TrayDialog;\r
11 import org.eclipse.jface.layout.GridDataFactory;\r
12 import org.eclipse.jface.layout.GridLayoutFactory;\r
13 import org.eclipse.jface.resource.FontDescriptor;\r
14 import org.eclipse.jface.viewers.ArrayContentProvider;\r
15 import org.eclipse.jface.viewers.CellEditor;\r
16 import org.eclipse.jface.viewers.ColumnLabelProvider;\r
17 import org.eclipse.jface.viewers.EditingSupport;\r
18 import org.eclipse.jface.viewers.TableViewer;\r
19 import org.eclipse.jface.viewers.TableViewerColumn;\r
20 import org.eclipse.jface.viewers.TextCellEditor;\r
21 import org.eclipse.swt.SWT;\r
22 import org.eclipse.swt.events.DisposeEvent;\r
23 import org.eclipse.swt.events.DisposeListener;\r
24 import org.eclipse.swt.events.MenuAdapter;\r
25 import org.eclipse.swt.events.MenuEvent;\r
26 import org.eclipse.swt.events.SelectionAdapter;\r
27 import org.eclipse.swt.events.SelectionEvent;\r
28 import org.eclipse.swt.graphics.Color;\r
29 import org.eclipse.swt.graphics.Font;\r
30 import org.eclipse.swt.widgets.Button;\r
31 import org.eclipse.swt.widgets.Composite;\r
32 import org.eclipse.swt.widgets.Control;\r
33 import org.eclipse.swt.widgets.Display;\r
34 import org.eclipse.swt.widgets.Menu;\r
35 import org.eclipse.swt.widgets.MenuItem;\r
36 import org.eclipse.swt.widgets.Shell;\r
37 import org.eclipse.swt.widgets.TableItem;\r
38 import org.osgi.framework.BundleContext;\r
39 import org.osgi.framework.InvalidSyntaxException;\r
40 import org.osgi.framework.ServiceReference;\r
41 import org.simantics.scl.compiler.commands.CommandSessionImportEntry;\r
42 import org.simantics.scl.ui.Activator;\r
43 import org.simantics.scl.ui.imports.ImportModulesAction;\r
44 \r
45 public class ManageImportsDialog extends TrayDialog {\r
46 \r
47     private static final String DIALOG = "ManageImportsDialog"; //$NON-NLS-1$\r
48 \r
49     TableViewer tableViewer;\r
50     ArrayList<CommandSessionImportEntry> imports;\r
51     IDialogSettings dialogBoundsSettings;\r
52 \r
53     public ManageImportsDialog(Shell shell, ArrayList<CommandSessionImportEntry> imports) {\r
54         super(shell);\r
55         this.imports = imports;\r
56 \r
57         IDialogSettings settings = Activator.getInstance().getDialogSettings();\r
58         dialogBoundsSettings = settings.getSection(DIALOG);\r
59         if (dialogBoundsSettings == null)\r
60             dialogBoundsSettings = settings.addNewSection(DIALOG);\r
61     }\r
62 \r
63     @Override\r
64     protected IDialogSettings getDialogBoundsSettings() {\r
65         return dialogBoundsSettings;\r
66     }\r
67 \r
68     @Override\r
69     protected void configureShell(Shell newShell) {\r
70         super.configureShell(newShell);\r
71         newShell.setText("Manage Imports");\r
72         newShell.setMinimumSize(800, 600);\r
73     }\r
74 \r
75     @Override\r
76     protected Control createDialogArea(Composite parent) {\r
77         final Composite composite = (Composite) super.createDialogArea(parent);\r
78         GridLayoutFactory.fillDefaults().margins(10,10).numColumns(2).applyTo(composite);\r
79         GridDataFactory.fillDefaults().grab(true,true).applyTo(composite);\r
80         \r
81         tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);\r
82         GridDataFactory.fillDefaults().grab(true, true).applyTo(tableViewer.getControl());\r
83 \r
84         // Colors\r
85         Display display = getShell().getDisplay(); \r
86         final Color black = display.getSystemColor(SWT.COLOR_BLACK);\r
87         final Color gray = display.getSystemColor(SWT.COLOR_GRAY);\r
88         final Color red = display.getSystemColor(SWT.COLOR_RED);\r
89         \r
90         // Fonts\r
91         final Font systemFont = display.getSystemFont();\r
92         final Font bold = FontDescriptor.createFrom(systemFont).setStyle(SWT.BOLD).createFont(display);\r
93         tableViewer.getTable().addDisposeListener(new DisposeListener() {\r
94             @Override\r
95             public void widgetDisposed(DisposeEvent e) {\r
96                 bold.dispose();\r
97             }\r
98         });\r
99         \r
100         // Column 1: module name\r
101         TableViewerColumn column1 = new TableViewerColumn(tableViewer, SWT.NONE);\r
102         column1.getColumn().setWidth(300);\r
103         column1.getColumn().setText("Module");\r
104         column1.setLabelProvider(new ColumnLabelProvider() {\r
105             @Override\r
106             public String getText(Object element) {\r
107                 return ((CommandSessionImportEntry)element).moduleName;\r
108             }\r
109             public Color getForeground(Object element) {\r
110                 CommandSessionImportEntry entry = (CommandSessionImportEntry)element;\r
111                 if(entry.disabled)\r
112                     return gray;\r
113                 else if(entry.hasError)\r
114                     return red;\r
115                 else\r
116                     return black;\r
117             }\r
118             public Font getFont(Object element) {\r
119                 CommandSessionImportEntry entry = (CommandSessionImportEntry)element;\r
120                 if(entry.persistent)\r
121                     return bold;\r
122                 else\r
123                     return systemFont;\r
124             }\r
125         });\r
126         column1.setEditingSupport(new EditingSupport(tableViewer) {\r
127             CellEditor editor = new TextCellEditor(tableViewer.getTable());\r
128             @Override\r
129             protected CellEditor getCellEditor(Object element) {\r
130                 return editor;\r
131             }\r
132             @Override\r
133             protected boolean canEdit(Object element) {\r
134                 return true;\r
135             }\r
136             @Override\r
137             protected Object getValue(Object element) {\r
138                 return ((CommandSessionImportEntry)element).moduleName;\r
139             }\r
140             @Override\r
141             protected void setValue(Object element, Object value) {\r
142                 ((CommandSessionImportEntry)element).moduleName = (String)value;\r
143                 getViewer().update(element, null);\r
144             }\r
145         });\r
146         \r
147         // Column 2: local name\r
148         TableViewerColumn column2 = new TableViewerColumn(tableViewer, SWT.NONE);\r
149         column2.getColumn().setWidth(100);\r
150         column2.getColumn().setText("Local name");\r
151         column2.setLabelProvider(new ColumnLabelProvider() {\r
152             @Override\r
153             public String getText(Object element) {\r
154                 return ((CommandSessionImportEntry)element).localName;\r
155             }\r
156         });\r
157         column2.setEditingSupport(new EditingSupport(tableViewer) {\r
158             CellEditor editor = new TextCellEditor(tableViewer.getTable());\r
159             @Override\r
160             protected CellEditor getCellEditor(Object element) {\r
161                 return editor;\r
162             }\r
163             @Override\r
164             protected boolean canEdit(Object element) {\r
165                 return true;\r
166             }\r
167             @Override\r
168             protected Object getValue(Object element) {\r
169                 return ((CommandSessionImportEntry)element).localName;\r
170             }\r
171             @Override\r
172             protected void setValue(Object element, Object value) {\r
173                 ((CommandSessionImportEntry)element).localName = (String)value;\r
174                 getViewer().update(element, null);\r
175             }\r
176         });\r
177         \r
178         // Column 3: status\r
179         TableViewerColumn column3 = new TableViewerColumn(tableViewer, SWT.NONE);\r
180         column3.getColumn().setWidth(200);\r
181         column3.getColumn().setText("Status");\r
182         column3.setLabelProvider(new ColumnLabelProvider() {\r
183             @Override\r
184             public String getText(Object element) {\r
185                 return ((CommandSessionImportEntry)element).getStatusString();\r
186             }\r
187         });\r
188         \r
189         // Decorations\r
190         tableViewer.getTable().setHeaderVisible(true);\r
191         tableViewer.getTable().setLinesVisible(true);\r
192         \r
193         // Selection\r
194         final Menu menu = new Menu(tableViewer.getTable());\r
195         tableViewer.getTable().setMenu(menu);\r
196         menu.addMenuListener(new MenuAdapter() {\r
197             @Override\r
198             public void menuShown(MenuEvent e) {\r
199                 MenuItem[] items = menu.getItems();\r
200                 for(int i=0;i < items.length;++i)\r
201                     items[i].dispose();\r
202                 TableItem[] tableItems = tableViewer.getTable().getSelection();\r
203                 final CommandSessionImportEntry[] entries = new CommandSessionImportEntry[tableItems.length];\r
204                 for(int i=0;i<tableItems.length;++i)\r
205                     entries[i] = (CommandSessionImportEntry)tableItems[i].getData();\r
206                 \r
207                 boolean hasPersistent = false;\r
208                 boolean hasTransient = false;\r
209                 boolean hasEnabled = false;\r
210                 boolean hasDisabled = false;\r
211                 \r
212                 for(CommandSessionImportEntry entry : entries) {\r
213                     if(entry.persistent)\r
214                         hasPersistent = true;\r
215                     else\r
216                         hasTransient = true;\r
217                     if(entry.disabled)\r
218                         hasDisabled = true;\r
219                     else\r
220                         hasEnabled = true;\r
221                 }\r
222                 \r
223                 {\r
224                     MenuItem menuItem = new MenuItem(menu, SWT.NONE);\r
225                     menuItem.setText("Delete");\r
226                     menuItem.addSelectionListener(new SelectionAdapter() {\r
227                         public void widgetSelected(SelectionEvent e) {\r
228                             THashSet<CommandSessionImportEntry> removedEntries =\r
229                                     new THashSet<CommandSessionImportEntry>(Arrays.asList(entries)); \r
230                             ArrayList<CommandSessionImportEntry> newImports = new ArrayList<CommandSessionImportEntry>(imports.size());\r
231                             for(CommandSessionImportEntry entry : imports)\r
232                                 if(!removedEntries.contains(entry))\r
233                                     newImports.add(entry);\r
234                             imports = newImports;\r
235                             setInput();\r
236                         }\r
237                     });\r
238                 }\r
239                 if(hasTransient) {\r
240                     MenuItem menuItem = new MenuItem(menu, SWT.NONE);\r
241                     menuItem.setText("Make persistent");\r
242                     menuItem.addSelectionListener(new SelectionAdapter() {\r
243                         public void widgetSelected(SelectionEvent e) {\r
244                             for(CommandSessionImportEntry entry : entries)\r
245                                 entry.persistent = true;\r
246                             setInput();\r
247                         }\r
248                     });\r
249                 }\r
250                 if(hasPersistent) {\r
251                     MenuItem menuItem = new MenuItem(menu, SWT.NONE);\r
252                     menuItem.setText("Make transient");\r
253                     menuItem.addSelectionListener(new SelectionAdapter() {\r
254                         public void widgetSelected(SelectionEvent e) {\r
255                             for(CommandSessionImportEntry entry : entries)\r
256                                 entry.persistent = false;\r
257                             setInput();\r
258                         }\r
259                     });\r
260                 }\r
261                 if(hasDisabled) {\r
262                     MenuItem menuItem = new MenuItem(menu, SWT.NONE);\r
263                     menuItem.setText("Enable");\r
264                     menuItem.addSelectionListener(new SelectionAdapter() {\r
265                         public void widgetSelected(SelectionEvent e) {\r
266                             for(CommandSessionImportEntry entry : entries)\r
267                                 entry.disabled = false;\r
268                             setInput();\r
269                         }\r
270                     });\r
271                 }\r
272                 if(hasEnabled) {\r
273                     MenuItem menuItem = new MenuItem(menu, SWT.NONE);\r
274                     menuItem.setText("Disable");\r
275                     menuItem.addSelectionListener(new SelectionAdapter() {\r
276                         public void widgetSelected(SelectionEvent e) {\r
277                             for(CommandSessionImportEntry entry : entries)\r
278                                 entry.disabled = true;\r
279                             setInput();\r
280                         }\r
281                     });\r
282                 }\r
283             }\r
284         });\r
285         \r
286         // Table content\r
287         tableViewer.setContentProvider(ArrayContentProvider.getInstance());\r
288         setInput();\r
289         \r
290         // Buttons\r
291         Composite buttonComposite = new Composite(composite, SWT.NONE);\r
292         GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(buttonComposite);\r
293         GridLayoutFactory.fillDefaults().applyTo(buttonComposite);\r
294         \r
295         BundleContext context = Activator.getInstance().getBundle().getBundleContext();\r
296         ArrayList<ImportModulesAction> actions = new ArrayList<ImportModulesAction>();\r
297         try {\r
298             for(ServiceReference<ImportModulesAction> ref : \r
299                 context.getServiceReferences(ImportModulesAction.class, null)) {\r
300                 ImportModulesAction action = context.getService(ref);\r
301                 actions.add(action);\r
302             }\r
303         } catch (InvalidSyntaxException e1) {\r
304             e1.printStackTrace();\r
305         }\r
306         \r
307         Collections.sort(actions);\r
308         \r
309         for(final ImportModulesAction action : actions) {\r
310             Button button = new Button(buttonComposite, SWT.NONE);\r
311             GridDataFactory.fillDefaults().applyTo(button);\r
312             button.setText(action.name);\r
313             button.addSelectionListener(new SelectionAdapter() {\r
314                 @Override\r
315                 public void widgetSelected(SelectionEvent e) {\r
316                     if(action.editImports(getShell(), imports))\r
317                         setInput();\r
318                 }\r
319             });\r
320         }\r
321         return composite;\r
322     }\r
323     \r
324     private void setInput() {\r
325         CommandSessionImportEntry[] array = imports.toArray(new CommandSessionImportEntry[imports.size()]);\r
326         Arrays.sort(array);\r
327         tableViewer.setInput(array);\r
328     }\r
329 \r
330     public ArrayList<CommandSessionImportEntry> getImports() {\r
331         return imports;\r
332     }\r
333     \r
334     @Override\r
335     protected boolean isResizable() {\r
336         return true;\r
337     }\r
338 }\r