1 package org.simantics.scl.ui.imports.internal;
\r
3 import gnu.trove.set.hash.THashSet;
\r
5 import java.util.ArrayList;
\r
6 import java.util.Arrays;
\r
7 import java.util.Collections;
\r
9 import org.eclipse.jface.dialogs.IDialogSettings;
\r
10 import org.eclipse.jface.dialogs.TrayDialog;
\r
11 import org.eclipse.jface.layout.GridDataFactory;
\r
12 import org.eclipse.jface.layout.GridLayoutFactory;
\r
13 import org.eclipse.jface.resource.FontDescriptor;
\r
14 import org.eclipse.jface.viewers.ArrayContentProvider;
\r
15 import org.eclipse.jface.viewers.CellEditor;
\r
16 import org.eclipse.jface.viewers.ColumnLabelProvider;
\r
17 import org.eclipse.jface.viewers.EditingSupport;
\r
18 import org.eclipse.jface.viewers.TableViewer;
\r
19 import org.eclipse.jface.viewers.TableViewerColumn;
\r
20 import org.eclipse.jface.viewers.TextCellEditor;
\r
21 import org.eclipse.swt.SWT;
\r
22 import org.eclipse.swt.events.DisposeEvent;
\r
23 import org.eclipse.swt.events.DisposeListener;
\r
24 import org.eclipse.swt.events.MenuAdapter;
\r
25 import org.eclipse.swt.events.MenuEvent;
\r
26 import org.eclipse.swt.events.SelectionAdapter;
\r
27 import org.eclipse.swt.events.SelectionEvent;
\r
28 import org.eclipse.swt.graphics.Color;
\r
29 import org.eclipse.swt.graphics.Font;
\r
30 import org.eclipse.swt.widgets.Button;
\r
31 import org.eclipse.swt.widgets.Composite;
\r
32 import org.eclipse.swt.widgets.Control;
\r
33 import org.eclipse.swt.widgets.Display;
\r
34 import org.eclipse.swt.widgets.Menu;
\r
35 import org.eclipse.swt.widgets.MenuItem;
\r
36 import org.eclipse.swt.widgets.Shell;
\r
37 import org.eclipse.swt.widgets.TableItem;
\r
38 import org.osgi.framework.BundleContext;
\r
39 import org.osgi.framework.InvalidSyntaxException;
\r
40 import org.osgi.framework.ServiceReference;
\r
41 import org.simantics.scl.compiler.commands.CommandSessionImportEntry;
\r
42 import org.simantics.scl.ui.Activator;
\r
43 import org.simantics.scl.ui.imports.ImportModulesAction;
\r
45 public class ManageImportsDialog extends TrayDialog {
\r
47 private static final String DIALOG = "ManageImportsDialog"; //$NON-NLS-1$
\r
49 TableViewer tableViewer;
\r
50 ArrayList<CommandSessionImportEntry> imports;
\r
51 IDialogSettings dialogBoundsSettings;
\r
53 public ManageImportsDialog(Shell shell, ArrayList<CommandSessionImportEntry> imports) {
\r
55 this.imports = imports;
\r
57 IDialogSettings settings = Activator.getInstance().getDialogSettings();
\r
58 dialogBoundsSettings = settings.getSection(DIALOG);
\r
59 if (dialogBoundsSettings == null)
\r
60 dialogBoundsSettings = settings.addNewSection(DIALOG);
\r
64 protected IDialogSettings getDialogBoundsSettings() {
\r
65 return dialogBoundsSettings;
\r
69 protected void configureShell(Shell newShell) {
\r
70 super.configureShell(newShell);
\r
71 newShell.setText("Manage Imports");
\r
72 newShell.setMinimumSize(800, 600);
\r
76 protected Control createDialogArea(Composite parent) {
\r
77 final Composite composite = (Composite) super.createDialogArea(parent);
\r
78 GridLayoutFactory.fillDefaults().margins(10,10).numColumns(2).applyTo(composite);
\r
79 GridDataFactory.fillDefaults().grab(true,true).applyTo(composite);
\r
81 tableViewer = new TableViewer(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
\r
82 GridDataFactory.fillDefaults().grab(true, true).applyTo(tableViewer.getControl());
\r
85 Display display = getShell().getDisplay();
\r
86 final Color black = display.getSystemColor(SWT.COLOR_BLACK);
\r
87 final Color gray = display.getSystemColor(SWT.COLOR_GRAY);
\r
88 final Color red = display.getSystemColor(SWT.COLOR_RED);
\r
91 final Font systemFont = display.getSystemFont();
\r
92 final Font bold = FontDescriptor.createFrom(systemFont).setStyle(SWT.BOLD).createFont(display);
\r
93 tableViewer.getTable().addDisposeListener(new DisposeListener() {
\r
95 public void widgetDisposed(DisposeEvent e) {
\r
100 // Column 1: module name
\r
101 TableViewerColumn column1 = new TableViewerColumn(tableViewer, SWT.NONE);
\r
102 column1.getColumn().setWidth(300);
\r
103 column1.getColumn().setText("Module");
\r
104 column1.setLabelProvider(new ColumnLabelProvider() {
\r
106 public String getText(Object element) {
\r
107 return ((CommandSessionImportEntry)element).moduleName;
\r
109 public Color getForeground(Object element) {
\r
110 CommandSessionImportEntry entry = (CommandSessionImportEntry)element;
\r
113 else if(entry.hasError)
\r
118 public Font getFont(Object element) {
\r
119 CommandSessionImportEntry entry = (CommandSessionImportEntry)element;
\r
120 if(entry.persistent)
\r
126 column1.setEditingSupport(new EditingSupport(tableViewer) {
\r
127 CellEditor editor = new TextCellEditor(tableViewer.getTable());
\r
129 protected CellEditor getCellEditor(Object element) {
\r
133 protected boolean canEdit(Object element) {
\r
137 protected Object getValue(Object element) {
\r
138 return ((CommandSessionImportEntry)element).moduleName;
\r
141 protected void setValue(Object element, Object value) {
\r
142 ((CommandSessionImportEntry)element).moduleName = (String)value;
\r
143 getViewer().update(element, null);
\r
147 // Column 2: local name
\r
148 TableViewerColumn column2 = new TableViewerColumn(tableViewer, SWT.NONE);
\r
149 column2.getColumn().setWidth(100);
\r
150 column2.getColumn().setText("Local name");
\r
151 column2.setLabelProvider(new ColumnLabelProvider() {
\r
153 public String getText(Object element) {
\r
154 return ((CommandSessionImportEntry)element).localName;
\r
157 column2.setEditingSupport(new EditingSupport(tableViewer) {
\r
158 CellEditor editor = new TextCellEditor(tableViewer.getTable());
\r
160 protected CellEditor getCellEditor(Object element) {
\r
164 protected boolean canEdit(Object element) {
\r
168 protected Object getValue(Object element) {
\r
169 return ((CommandSessionImportEntry)element).localName;
\r
172 protected void setValue(Object element, Object value) {
\r
173 ((CommandSessionImportEntry)element).localName = (String)value;
\r
174 getViewer().update(element, null);
\r
178 // Column 3: status
\r
179 TableViewerColumn column3 = new TableViewerColumn(tableViewer, SWT.NONE);
\r
180 column3.getColumn().setWidth(200);
\r
181 column3.getColumn().setText("Status");
\r
182 column3.setLabelProvider(new ColumnLabelProvider() {
\r
184 public String getText(Object element) {
\r
185 return ((CommandSessionImportEntry)element).getStatusString();
\r
190 tableViewer.getTable().setHeaderVisible(true);
\r
191 tableViewer.getTable().setLinesVisible(true);
\r
194 final Menu menu = new Menu(tableViewer.getTable());
\r
195 tableViewer.getTable().setMenu(menu);
\r
196 menu.addMenuListener(new MenuAdapter() {
\r
198 public void menuShown(MenuEvent e) {
\r
199 MenuItem[] items = menu.getItems();
\r
200 for(int i=0;i < items.length;++i)
\r
201 items[i].dispose();
\r
202 TableItem[] tableItems = tableViewer.getTable().getSelection();
\r
203 final CommandSessionImportEntry[] entries = new CommandSessionImportEntry[tableItems.length];
\r
204 for(int i=0;i<tableItems.length;++i)
\r
205 entries[i] = (CommandSessionImportEntry)tableItems[i].getData();
\r
207 boolean hasPersistent = false;
\r
208 boolean hasTransient = false;
\r
209 boolean hasEnabled = false;
\r
210 boolean hasDisabled = false;
\r
212 for(CommandSessionImportEntry entry : entries) {
\r
213 if(entry.persistent)
\r
214 hasPersistent = true;
\r
216 hasTransient = true;
\r
218 hasDisabled = true;
\r
224 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
\r
225 menuItem.setText("Delete");
\r
226 menuItem.addSelectionListener(new SelectionAdapter() {
\r
227 public void widgetSelected(SelectionEvent e) {
\r
228 THashSet<CommandSessionImportEntry> removedEntries =
\r
229 new THashSet<CommandSessionImportEntry>(Arrays.asList(entries));
\r
230 ArrayList<CommandSessionImportEntry> newImports = new ArrayList<CommandSessionImportEntry>(imports.size());
\r
231 for(CommandSessionImportEntry entry : imports)
\r
232 if(!removedEntries.contains(entry))
\r
233 newImports.add(entry);
\r
234 imports = newImports;
\r
240 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
\r
241 menuItem.setText("Make persistent");
\r
242 menuItem.addSelectionListener(new SelectionAdapter() {
\r
243 public void widgetSelected(SelectionEvent e) {
\r
244 for(CommandSessionImportEntry entry : entries)
\r
245 entry.persistent = true;
\r
250 if(hasPersistent) {
\r
251 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
\r
252 menuItem.setText("Make transient");
\r
253 menuItem.addSelectionListener(new SelectionAdapter() {
\r
254 public void widgetSelected(SelectionEvent e) {
\r
255 for(CommandSessionImportEntry entry : entries)
\r
256 entry.persistent = false;
\r
262 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
\r
263 menuItem.setText("Enable");
\r
264 menuItem.addSelectionListener(new SelectionAdapter() {
\r
265 public void widgetSelected(SelectionEvent e) {
\r
266 for(CommandSessionImportEntry entry : entries)
\r
267 entry.disabled = false;
\r
273 MenuItem menuItem = new MenuItem(menu, SWT.NONE);
\r
274 menuItem.setText("Disable");
\r
275 menuItem.addSelectionListener(new SelectionAdapter() {
\r
276 public void widgetSelected(SelectionEvent e) {
\r
277 for(CommandSessionImportEntry entry : entries)
\r
278 entry.disabled = true;
\r
287 tableViewer.setContentProvider(ArrayContentProvider.getInstance());
\r
291 Composite buttonComposite = new Composite(composite, SWT.NONE);
\r
292 GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.BEGINNING).applyTo(buttonComposite);
\r
293 GridLayoutFactory.fillDefaults().applyTo(buttonComposite);
\r
295 BundleContext context = Activator.getInstance().getBundle().getBundleContext();
\r
296 ArrayList<ImportModulesAction> actions = new ArrayList<ImportModulesAction>();
\r
298 for(ServiceReference<ImportModulesAction> ref :
\r
299 context.getServiceReferences(ImportModulesAction.class, null)) {
\r
300 ImportModulesAction action = context.getService(ref);
\r
301 actions.add(action);
\r
303 } catch (InvalidSyntaxException e1) {
\r
304 e1.printStackTrace();
\r
307 Collections.sort(actions);
\r
309 for(final ImportModulesAction action : actions) {
\r
310 Button button = new Button(buttonComposite, SWT.NONE);
\r
311 GridDataFactory.fillDefaults().applyTo(button);
\r
312 button.setText(action.name);
\r
313 button.addSelectionListener(new SelectionAdapter() {
\r
315 public void widgetSelected(SelectionEvent e) {
\r
316 if(action.editImports(getShell(), imports))
\r
324 private void setInput() {
\r
325 CommandSessionImportEntry[] array = imports.toArray(new CommandSessionImportEntry[imports.size()]);
\r
326 Arrays.sort(array);
\r
327 tableViewer.setInput(array);
\r
330 public ArrayList<CommandSessionImportEntry> getImports() {
\r
335 protected boolean isResizable() {
\r