]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/imports/internal/ManageImportsDialog.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/imports/internal/ManageImportsDialog.java
new file mode 100644 (file)
index 0000000..522042a
--- /dev/null
@@ -0,0 +1,338 @@
+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