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