1 package org.simantics.scl.ui.imports.internal;
3 import gnu.trove.set.hash.THashSet;
5 import java.util.ArrayList;
6 import java.util.Arrays;
7 import java.util.Collections;
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;
45 public class ManageImportsDialog extends TrayDialog {
47 private static final String DIALOG = "ManageImportsDialog"; //$NON-NLS-1$
49 TableViewer tableViewer;
50 ArrayList<CommandSessionImportEntry> imports;
51 IDialogSettings dialogBoundsSettings;
53 public ManageImportsDialog(Shell shell, ArrayList<CommandSessionImportEntry> imports) {
55 this.imports = imports;
57 IDialogSettings settings = Activator.getInstance().getDialogSettings();
58 dialogBoundsSettings = settings.getSection(DIALOG);
59 if (dialogBoundsSettings == null)
60 dialogBoundsSettings = settings.addNewSection(DIALOG);
64 protected IDialogSettings getDialogBoundsSettings() {
65 return dialogBoundsSettings;
69 protected void configureShell(Shell newShell) {
70 super.configureShell(newShell);
71 newShell.setText("Manage Imports");
72 newShell.setMinimumSize(800, 600);
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);
81 tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
82 GridDataFactory.fillDefaults().grab(true, true).applyTo(tableViewer.getControl());
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);
91 final Font systemFont = display.getSystemFont();
92 final Font bold = FontDescriptor.createFrom(systemFont).setStyle(SWT.BOLD).createFont(display);
93 tableViewer.getTable().addDisposeListener(new DisposeListener() {
95 public void widgetDisposed(DisposeEvent e) {
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() {
106 public String getText(Object element) {
107 return ((CommandSessionImportEntry)element).moduleName;
109 public Color getForeground(Object element) {
110 CommandSessionImportEntry entry = (CommandSessionImportEntry)element;
113 else if(entry.hasError)
118 public Font getFont(Object element) {
119 CommandSessionImportEntry entry = (CommandSessionImportEntry)element;
126 column1.setEditingSupport(new EditingSupport(tableViewer) {
127 CellEditor editor = new TextCellEditor(tableViewer.getTable());
129 protected CellEditor getCellEditor(Object element) {
133 protected boolean canEdit(Object element) {
137 protected Object getValue(Object element) {
138 return ((CommandSessionImportEntry)element).moduleName;
141 protected void setValue(Object element, Object value) {
142 ((CommandSessionImportEntry)element).moduleName = (String)value;
143 getViewer().update(element, null);
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() {
153 public String getText(Object element) {
154 return ((CommandSessionImportEntry)element).localName;
157 column2.setEditingSupport(new EditingSupport(tableViewer) {
158 CellEditor editor = new TextCellEditor(tableViewer.getTable());
160 protected CellEditor getCellEditor(Object element) {
164 protected boolean canEdit(Object element) {
168 protected Object getValue(Object element) {
169 return ((CommandSessionImportEntry)element).localName;
172 protected void setValue(Object element, Object value) {
173 ((CommandSessionImportEntry)element).localName = (String)value;
174 getViewer().update(element, null);
179 TableViewerColumn column3 = new TableViewerColumn(tableViewer, SWT.NONE);
180 column3.getColumn().setWidth(200);
181 column3.getColumn().setText("Status");
182 column3.setLabelProvider(new ColumnLabelProvider() {
184 public String getText(Object element) {
185 return ((CommandSessionImportEntry)element).getStatusString();
190 tableViewer.getTable().setHeaderVisible(true);
191 tableViewer.getTable().setLinesVisible(true);
194 final Menu menu = new Menu(tableViewer.getTable());
195 tableViewer.getTable().setMenu(menu);
196 menu.addMenuListener(new MenuAdapter() {
198 public void menuShown(MenuEvent e) {
199 MenuItem[] items = menu.getItems();
200 for(int i=0;i < items.length;++i)
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();
207 boolean hasPersistent = false;
208 boolean hasTransient = false;
209 boolean hasEnabled = false;
210 boolean hasDisabled = false;
212 for(CommandSessionImportEntry entry : entries) {
214 hasPersistent = true;
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;
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;
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;
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;
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;
287 tableViewer.setContentProvider(ArrayContentProvider.getInstance());
291 Composite buttonComposite = new Composite(composite, SWT.NONE);
292 GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(buttonComposite);
293 GridLayoutFactory.fillDefaults().applyTo(buttonComposite);
295 BundleContext context = Activator.getInstance().getBundle().getBundleContext();
296 ArrayList<ImportModulesAction> actions = new ArrayList<ImportModulesAction>();
298 for(ServiceReference<ImportModulesAction> ref :
299 context.getServiceReferences(ImportModulesAction.class, null)) {
300 ImportModulesAction action = context.getService(ref);
303 } catch (InvalidSyntaxException e1) {
304 e1.printStackTrace();
307 Collections.sort(actions);
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() {
315 public void widgetSelected(SelectionEvent e) {
316 if(action.editImports(getShell(), imports))
324 private void setInput() {
325 CommandSessionImportEntry[] array = imports.toArray(new CommandSessionImportEntry[imports.size()]);
327 tableViewer.setInput(array);
330 public ArrayList<CommandSessionImportEntry> getImports() {
335 protected boolean isResizable() {