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