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.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;
47 public class ManageImportsDialog extends TrayDialog {
49 private static final String DIALOG = "ManageImportsDialog"; //$NON-NLS-1$
51 TableViewer tableViewer;
52 ArrayList<CommandSessionImportEntry> imports;
53 IDialogSettings dialogBoundsSettings;
55 public ManageImportsDialog(Shell shell, ArrayList<CommandSessionImportEntry> imports) {
57 this.imports = imports;
59 IDialogSettings settings = Activator.getInstance().getDialogSettings();
60 dialogBoundsSettings = settings.getSection(DIALOG);
61 if (dialogBoundsSettings == null)
62 dialogBoundsSettings = settings.addNewSection(DIALOG);
66 protected IDialogSettings getDialogBoundsSettings() {
67 return dialogBoundsSettings;
71 protected void configureShell(Shell newShell) {
72 super.configureShell(newShell);
73 newShell.setText("Manage Imports");
74 newShell.setMinimumSize(800, 600);
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);
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);
88 tableViewer = new TableViewer(tableComposite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
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);
97 final Font systemFont = display.getSystemFont();
98 final Font bold = FontDescriptor.createFrom(systemFont).setStyle(SWT.BOLD).createFont(display);
99 tableViewer.getTable().addDisposeListener(new DisposeListener() {
101 public void widgetDisposed(DisposeEvent e) {
106 // Column 1: module name
107 TableViewerColumn column1 = new TableViewerColumn(tableViewer, SWT.NONE);
108 column1.getColumn().setWidth(300);
109 column1.getColumn().setText("Module");
110 column1.setLabelProvider(new ColumnLabelProvider() {
112 public String getText(Object element) {
113 return ((CommandSessionImportEntry)element).moduleName;
115 public Color getForeground(Object element) {
116 CommandSessionImportEntry entry = (CommandSessionImportEntry)element;
119 else if(entry.hasError)
124 public Font getFont(Object element) {
125 CommandSessionImportEntry entry = (CommandSessionImportEntry)element;
132 column1.setEditingSupport(new EditingSupport(tableViewer) {
133 CellEditor editor = new TextCellEditor(tableViewer.getTable());
135 protected CellEditor getCellEditor(Object element) {
139 protected boolean canEdit(Object element) {
143 protected Object getValue(Object element) {
144 return ((CommandSessionImportEntry)element).moduleName;
147 protected void setValue(Object element, Object value) {
148 ((CommandSessionImportEntry)element).moduleName = (String)value;
149 getViewer().update(element, null);
153 // Column 2: local name
154 TableViewerColumn column2 = new TableViewerColumn(tableViewer, SWT.NONE);
155 column2.getColumn().setWidth(100);
156 column2.getColumn().setText("Local name");
157 column2.setLabelProvider(new ColumnLabelProvider() {
159 public String getText(Object element) {
160 return ((CommandSessionImportEntry)element).localName;
163 column2.setEditingSupport(new EditingSupport(tableViewer) {
164 CellEditor editor = new TextCellEditor(tableViewer.getTable());
166 protected CellEditor getCellEditor(Object element) {
170 protected boolean canEdit(Object element) {
174 protected Object getValue(Object element) {
175 return ((CommandSessionImportEntry)element).localName;
178 protected void setValue(Object element, Object value) {
179 ((CommandSessionImportEntry)element).localName = (String)value;
180 getViewer().update(element, null);
185 TableViewerColumn column3 = new TableViewerColumn(tableViewer, SWT.NONE);
186 column3.getColumn().setWidth(200);
187 column3.getColumn().setText("Status");
188 column3.setLabelProvider(new ColumnLabelProvider() {
190 public String getText(Object element) {
191 return ((CommandSessionImportEntry)element).getStatusString();
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));
200 tableViewer.getTable().setHeaderVisible(true);
201 tableViewer.getTable().setLinesVisible(true);
204 final Menu menu = new Menu(tableViewer.getTable());
205 tableViewer.getTable().setMenu(menu);
206 menu.addMenuListener(new MenuAdapter() {
208 public void menuShown(MenuEvent e) {
209 MenuItem[] items = menu.getItems();
210 for(int i=0;i < items.length;++i)
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();
217 boolean hasPersistent = false;
218 boolean hasTransient = false;
219 boolean hasEnabled = false;
220 boolean hasDisabled = false;
222 for(CommandSessionImportEntry entry : entries) {
224 hasPersistent = true;
234 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
235 menuItem.setText("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;
250 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
251 menuItem.setText("Make persistent");
252 menuItem.addSelectionListener(new SelectionAdapter() {
253 public void widgetSelected(SelectionEvent e) {
254 for(CommandSessionImportEntry entry : entries)
255 entry.persistent = true;
261 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
262 menuItem.setText("Make transient");
263 menuItem.addSelectionListener(new SelectionAdapter() {
264 public void widgetSelected(SelectionEvent e) {
265 for(CommandSessionImportEntry entry : entries)
266 entry.persistent = false;
272 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
273 menuItem.setText("Enable");
274 menuItem.addSelectionListener(new SelectionAdapter() {
275 public void widgetSelected(SelectionEvent e) {
276 for(CommandSessionImportEntry entry : entries)
277 entry.disabled = false;
283 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
284 menuItem.setText("Disable");
285 menuItem.addSelectionListener(new SelectionAdapter() {
286 public void widgetSelected(SelectionEvent e) {
287 for(CommandSessionImportEntry entry : entries)
288 entry.disabled = true;
297 tableViewer.setContentProvider(ArrayContentProvider.getInstance());
301 Composite buttonComposite = new Composite(composite, SWT.NONE);
302 GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(buttonComposite);
303 GridLayoutFactory.fillDefaults().applyTo(buttonComposite);
305 BundleContext context = Activator.getInstance().getBundle().getBundleContext();
306 ArrayList<ImportModulesAction> actions = new ArrayList<ImportModulesAction>();
308 for(ServiceReference<ImportModulesAction> ref :
309 context.getServiceReferences(ImportModulesAction.class, null)) {
310 ImportModulesAction action = context.getService(ref);
313 } catch (InvalidSyntaxException e1) {
314 e1.printStackTrace();
317 Collections.sort(actions);
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() {
325 public void widgetSelected(SelectionEvent e) {
326 if(action.editImports(getShell(), imports))
334 private void setInput() {
335 CommandSessionImportEntry[] array = imports.toArray(new CommandSessionImportEntry[imports.size()]);
337 tableViewer.setInput(array);
340 public ArrayList<CommandSessionImportEntry> getImports() {
345 protected boolean isResizable() {