--- /dev/null
+package org.simantics.scl.ui.imports.internal;\r
+\r
+import gnu.trove.set.hash.THashSet;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Collections;\r
+\r
+import org.eclipse.jface.dialogs.IDialogSettings;\r
+import org.eclipse.jface.dialogs.TrayDialog;\r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.jface.layout.GridLayoutFactory;\r
+import org.eclipse.jface.resource.FontDescriptor;\r
+import org.eclipse.jface.viewers.ArrayContentProvider;\r
+import org.eclipse.jface.viewers.CellEditor;\r
+import org.eclipse.jface.viewers.ColumnLabelProvider;\r
+import org.eclipse.jface.viewers.EditingSupport;\r
+import org.eclipse.jface.viewers.TableViewer;\r
+import org.eclipse.jface.viewers.TableViewerColumn;\r
+import org.eclipse.jface.viewers.TextCellEditor;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.DisposeEvent;\r
+import org.eclipse.swt.events.DisposeListener;\r
+import org.eclipse.swt.events.MenuAdapter;\r
+import org.eclipse.swt.events.MenuEvent;\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.Font;\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.Display;\r
+import org.eclipse.swt.widgets.Menu;\r
+import org.eclipse.swt.widgets.MenuItem;\r
+import org.eclipse.swt.widgets.Shell;\r
+import org.eclipse.swt.widgets.TableItem;\r
+import org.osgi.framework.BundleContext;\r
+import org.osgi.framework.InvalidSyntaxException;\r
+import org.osgi.framework.ServiceReference;\r
+import org.simantics.scl.compiler.commands.CommandSessionImportEntry;\r
+import org.simantics.scl.ui.Activator;\r
+import org.simantics.scl.ui.imports.ImportModulesAction;\r
+\r
+public class ManageImportsDialog extends TrayDialog {\r
+\r
+ private static final String DIALOG = "ManageImportsDialog"; //$NON-NLS-1$\r
+\r
+ TableViewer tableViewer;\r
+ ArrayList<CommandSessionImportEntry> imports;\r
+ IDialogSettings dialogBoundsSettings;\r
+\r
+ public ManageImportsDialog(Shell shell, ArrayList<CommandSessionImportEntry> imports) {\r
+ super(shell);\r
+ this.imports = imports;\r
+\r
+ IDialogSettings settings = Activator.getInstance().getDialogSettings();\r
+ dialogBoundsSettings = settings.getSection(DIALOG);\r
+ if (dialogBoundsSettings == null)\r
+ dialogBoundsSettings = settings.addNewSection(DIALOG);\r
+ }\r
+\r
+ @Override\r
+ protected IDialogSettings getDialogBoundsSettings() {\r
+ return dialogBoundsSettings;\r
+ }\r
+\r
+ @Override\r
+ protected void configureShell(Shell newShell) {\r
+ super.configureShell(newShell);\r
+ newShell.setText("Manage Imports");\r
+ newShell.setMinimumSize(800, 600);\r
+ }\r
+\r
+ @Override\r
+ protected Control createDialogArea(Composite parent) {\r
+ final Composite composite = (Composite) super.createDialogArea(parent);\r
+ GridLayoutFactory.fillDefaults().margins(10,10).numColumns(2).applyTo(composite);\r
+ GridDataFactory.fillDefaults().grab(true,true).applyTo(composite);\r
+ \r
+ tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);\r
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(tableViewer.getControl());\r
+\r
+ // Colors\r
+ Display display = getShell().getDisplay(); \r
+ final Color black = display.getSystemColor(SWT.COLOR_BLACK);\r
+ final Color gray = display.getSystemColor(SWT.COLOR_GRAY);\r
+ final Color red = display.getSystemColor(SWT.COLOR_RED);\r
+ \r
+ // Fonts\r
+ final Font systemFont = display.getSystemFont();\r
+ final Font bold = FontDescriptor.createFrom(systemFont).setStyle(SWT.BOLD).createFont(display);\r
+ tableViewer.getTable().addDisposeListener(new DisposeListener() {\r
+ @Override\r
+ public void widgetDisposed(DisposeEvent e) {\r
+ bold.dispose();\r
+ }\r
+ });\r
+ \r
+ // Column 1: module name\r
+ TableViewerColumn column1 = new TableViewerColumn(tableViewer, SWT.NONE);\r
+ column1.getColumn().setWidth(300);\r
+ column1.getColumn().setText("Module");\r
+ column1.setLabelProvider(new ColumnLabelProvider() {\r
+ @Override\r
+ public String getText(Object element) {\r
+ return ((CommandSessionImportEntry)element).moduleName;\r
+ }\r
+ public Color getForeground(Object element) {\r
+ CommandSessionImportEntry entry = (CommandSessionImportEntry)element;\r
+ if(entry.disabled)\r
+ return gray;\r
+ else if(entry.hasError)\r
+ return red;\r
+ else\r
+ return black;\r
+ }\r
+ public Font getFont(Object element) {\r
+ CommandSessionImportEntry entry = (CommandSessionImportEntry)element;\r
+ if(entry.persistent)\r
+ return bold;\r
+ else\r
+ return systemFont;\r
+ }\r
+ });\r
+ column1.setEditingSupport(new EditingSupport(tableViewer) {\r
+ CellEditor editor = new TextCellEditor(tableViewer.getTable());\r
+ @Override\r
+ protected CellEditor getCellEditor(Object element) {\r
+ return editor;\r
+ }\r
+ @Override\r
+ protected boolean canEdit(Object element) {\r
+ return true;\r
+ }\r
+ @Override\r
+ protected Object getValue(Object element) {\r
+ return ((CommandSessionImportEntry)element).moduleName;\r
+ }\r
+ @Override\r
+ protected void setValue(Object element, Object value) {\r
+ ((CommandSessionImportEntry)element).moduleName = (String)value;\r
+ getViewer().update(element, null);\r
+ }\r
+ });\r
+ \r
+ // Column 2: local name\r
+ TableViewerColumn column2 = new TableViewerColumn(tableViewer, SWT.NONE);\r
+ column2.getColumn().setWidth(100);\r
+ column2.getColumn().setText("Local name");\r
+ column2.setLabelProvider(new ColumnLabelProvider() {\r
+ @Override\r
+ public String getText(Object element) {\r
+ return ((CommandSessionImportEntry)element).localName;\r
+ }\r
+ });\r
+ column2.setEditingSupport(new EditingSupport(tableViewer) {\r
+ CellEditor editor = new TextCellEditor(tableViewer.getTable());\r
+ @Override\r
+ protected CellEditor getCellEditor(Object element) {\r
+ return editor;\r
+ }\r
+ @Override\r
+ protected boolean canEdit(Object element) {\r
+ return true;\r
+ }\r
+ @Override\r
+ protected Object getValue(Object element) {\r
+ return ((CommandSessionImportEntry)element).localName;\r
+ }\r
+ @Override\r
+ protected void setValue(Object element, Object value) {\r
+ ((CommandSessionImportEntry)element).localName = (String)value;\r
+ getViewer().update(element, null);\r
+ }\r
+ });\r
+ \r
+ // Column 3: status\r
+ TableViewerColumn column3 = new TableViewerColumn(tableViewer, SWT.NONE);\r
+ column3.getColumn().setWidth(200);\r
+ column3.getColumn().setText("Status");\r
+ column3.setLabelProvider(new ColumnLabelProvider() {\r
+ @Override\r
+ public String getText(Object element) {\r
+ return ((CommandSessionImportEntry)element).getStatusString();\r
+ }\r
+ });\r
+ \r
+ // Decorations\r
+ tableViewer.getTable().setHeaderVisible(true);\r
+ tableViewer.getTable().setLinesVisible(true);\r
+ \r
+ // Selection\r
+ final Menu menu = new Menu(tableViewer.getTable());\r
+ tableViewer.getTable().setMenu(menu);\r
+ menu.addMenuListener(new MenuAdapter() {\r
+ @Override\r
+ public void menuShown(MenuEvent e) {\r
+ MenuItem[] items = menu.getItems();\r
+ for(int i=0;i < items.length;++i)\r
+ items[i].dispose();\r
+ TableItem[] tableItems = tableViewer.getTable().getSelection();\r
+ final CommandSessionImportEntry[] entries = new CommandSessionImportEntry[tableItems.length];\r
+ for(int i=0;i<tableItems.length;++i)\r
+ entries[i] = (CommandSessionImportEntry)tableItems[i].getData();\r
+ \r
+ boolean hasPersistent = false;\r
+ boolean hasTransient = false;\r
+ boolean hasEnabled = false;\r
+ boolean hasDisabled = false;\r
+ \r
+ for(CommandSessionImportEntry entry : entries) {\r
+ if(entry.persistent)\r
+ hasPersistent = true;\r
+ else\r
+ hasTransient = true;\r
+ if(entry.disabled)\r
+ hasDisabled = true;\r
+ else\r
+ hasEnabled = true;\r
+ }\r
+ \r
+ {\r
+ MenuItem menuItem = new MenuItem(menu, SWT.NONE);\r
+ menuItem.setText("Delete");\r
+ menuItem.addSelectionListener(new SelectionAdapter() {\r
+ public void widgetSelected(SelectionEvent e) {\r
+ THashSet<CommandSessionImportEntry> removedEntries =\r
+ new THashSet<CommandSessionImportEntry>(Arrays.asList(entries)); \r
+ ArrayList<CommandSessionImportEntry> newImports = new ArrayList<CommandSessionImportEntry>(imports.size());\r
+ for(CommandSessionImportEntry entry : imports)\r
+ if(!removedEntries.contains(entry))\r
+ newImports.add(entry);\r
+ imports = newImports;\r
+ setInput();\r
+ }\r
+ });\r
+ }\r
+ if(hasTransient) {\r
+ MenuItem menuItem = new MenuItem(menu, SWT.NONE);\r
+ menuItem.setText("Make persistent");\r
+ menuItem.addSelectionListener(new SelectionAdapter() {\r
+ public void widgetSelected(SelectionEvent e) {\r
+ for(CommandSessionImportEntry entry : entries)\r
+ entry.persistent = true;\r
+ setInput();\r
+ }\r
+ });\r
+ }\r
+ if(hasPersistent) {\r
+ MenuItem menuItem = new MenuItem(menu, SWT.NONE);\r
+ menuItem.setText("Make transient");\r
+ menuItem.addSelectionListener(new SelectionAdapter() {\r
+ public void widgetSelected(SelectionEvent e) {\r
+ for(CommandSessionImportEntry entry : entries)\r
+ entry.persistent = false;\r
+ setInput();\r
+ }\r
+ });\r
+ }\r
+ if(hasDisabled) {\r
+ MenuItem menuItem = new MenuItem(menu, SWT.NONE);\r
+ menuItem.setText("Enable");\r
+ menuItem.addSelectionListener(new SelectionAdapter() {\r
+ public void widgetSelected(SelectionEvent e) {\r
+ for(CommandSessionImportEntry entry : entries)\r
+ entry.disabled = false;\r
+ setInput();\r
+ }\r
+ });\r
+ }\r
+ if(hasEnabled) {\r
+ MenuItem menuItem = new MenuItem(menu, SWT.NONE);\r
+ menuItem.setText("Disable");\r
+ menuItem.addSelectionListener(new SelectionAdapter() {\r
+ public void widgetSelected(SelectionEvent e) {\r
+ for(CommandSessionImportEntry entry : entries)\r
+ entry.disabled = true;\r
+ setInput();\r
+ }\r
+ });\r
+ }\r
+ }\r
+ });\r
+ \r
+ // Table content\r
+ tableViewer.setContentProvider(ArrayContentProvider.getInstance());\r
+ setInput();\r
+ \r
+ // Buttons\r
+ Composite buttonComposite = new Composite(composite, SWT.NONE);\r
+ GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(buttonComposite);\r
+ GridLayoutFactory.fillDefaults().applyTo(buttonComposite);\r
+ \r
+ BundleContext context = Activator.getInstance().getBundle().getBundleContext();\r
+ ArrayList<ImportModulesAction> actions = new ArrayList<ImportModulesAction>();\r
+ try {\r
+ for(ServiceReference<ImportModulesAction> ref : \r
+ context.getServiceReferences(ImportModulesAction.class, null)) {\r
+ ImportModulesAction action = context.getService(ref);\r
+ actions.add(action);\r
+ }\r
+ } catch (InvalidSyntaxException e1) {\r
+ e1.printStackTrace();\r
+ }\r
+ \r
+ Collections.sort(actions);\r
+ \r
+ for(final ImportModulesAction action : actions) {\r
+ Button button = new Button(buttonComposite, SWT.NONE);\r
+ GridDataFactory.fillDefaults().applyTo(button);\r
+ button.setText(action.name);\r
+ button.addSelectionListener(new SelectionAdapter() {\r
+ @Override\r
+ public void widgetSelected(SelectionEvent e) {\r
+ if(action.editImports(getShell(), imports))\r
+ setInput();\r
+ }\r
+ });\r
+ }\r
+ return composite;\r
+ }\r
+ \r
+ private void setInput() {\r
+ CommandSessionImportEntry[] array = imports.toArray(new CommandSessionImportEntry[imports.size()]);\r
+ Arrays.sort(array);\r
+ tableViewer.setInput(array);\r
+ }\r
+\r
+ public ArrayList<CommandSessionImportEntry> getImports() {\r
+ return imports;\r
+ }\r
+ \r
+ @Override\r
+ protected boolean isResizable() {\r
+ return true;\r
+ }\r
+}\r