package fr.inria.atlanmod.neo4emf.neo4jresolver.preferences; import java.io.IOException; import java.util.List; import java.util.Observable; import java.util.Observer; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import fr.inria.atlanmod.neo4emf.neo4jresolver.logger.Logger; import fr.inria.atlanmod.neo4emf.neo4jresolver.providers.Neo4jRuntimeLabelProvider; import fr.inria.atlanmod.neo4emf.neo4jresolver.runtimes.INeo4jRuntime; import fr.inria.atlanmod.neo4emf.neo4jresolver.runtimes.internal.Neo4JRuntimesManager; /** * * @author abelgomez * */ public class Neo4JRuntimesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private List<INeo4jRuntime> runtimes; private TableViewer viewer; private Button addButton; private Button removeButton; private Observer refreshObserver = new Observer() { @Override public void update(Observable observable, Object object) { Display display = Display.getCurrent() != null ? Display.getCurrent() : Display.getDefault(); display.asyncExec(new Runnable() { @Override public void run() { if (viewer != null && !viewer.getTable().isDisposed()) { viewer.refresh(); } } }); } }; public Neo4JRuntimesPreferencePage() { super("Neo4J Runtimes"); setDescription("Available Neo4J Runtimes"); } /* (non-Javadoc) * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) */ @Override public void init(IWorkbench workbench) { runtimes = Neo4JRuntimesManager.INSTANCE.getRuntimes(); noDefaultAndApplyButton(); } /* (non-Javadoc) * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite) */ @Override protected Control createContents(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); composite.setLayout(new GridLayout(2, false)); Table table = new Table(composite, SWT.BORDER); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); viewer = new TableViewer(table); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new Neo4jRuntimeLabelProvider()); viewer.setInput(runtimes); viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { removeButton.setEnabled(!event.getSelection().isEmpty()); } }); Composite buttonsComposite = new Composite(composite, SWT.NULL); buttonsComposite.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false)); buttonsComposite.setLayout(new FillLayout(SWT.VERTICAL)); addButton = new Button(buttonsComposite, SWT.PUSH); addButton.setText("&Add More..."); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Neo4JRuntimesManager.INSTANCE.launchInstallRuntimesWizard(); } }); removeButton = new Button(buttonsComposite, SWT.PUSH); removeButton.setText("&Uninstall"); removeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { if (viewer.getSelection() instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) viewer.getSelection(); INeo4jRuntime runtime = (INeo4jRuntime) structuredSelection.getFirstElement(); boolean delete = MessageDialog.openQuestion(getShell(), "Uninstall runtime", NLS.bind("Uninstall Neo4J runtime v.{0}?", runtime.getVersion())); if (delete) { try { Neo4JRuntimesManager.INSTANCE.uninstall(runtime.getId()); } catch (IOException e) { Logger.log(Logger.SEVERITY_ERROR, NLS.bind("Unable to uninstall {0} runtime", runtime.getId()), e); } } } } }); if (runtimes instanceof Observable) { ((Observable) runtimes).addObserver(refreshObserver); } return composite; } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.DialogPage#dispose() */ @Override public void dispose() { if (runtimes instanceof Observable) { ((Observable) runtimes).deleteObserver(refreshObserver); } super.dispose(); } }