package fr.opensagres.mongodb.ide.launching.internal.preferences;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import fr.opensagres.mongodb.ide.core.Platform;
import fr.opensagres.mongodb.ide.core.model.MongoRuntime;
import fr.opensagres.mongodb.ide.launching.internal.Activator;
import fr.opensagres.mongodb.ide.launching.internal.Messages;
import fr.opensagres.mongodb.ide.launching.internal.dialogs.AddRuntimeDialog;
public class InstalledRuntimesBlock extends AbstractTableBlock implements
ISelectionProvider {
private Composite fControl;
private final List<MongoRuntime> runtimes = new ArrayList<MongoRuntime>();
private CheckboxTableViewer tableViewer;
private Button fAddButton;
private Button fRemoveButton;
private Button fEditButton;
private final ListenerList fSelectionListeners = new ListenerList();
private ISelection fPrevSelection = new StructuredSelection();
public void addSelectionChangedListener(ISelectionChangedListener listener) {
fSelectionListeners.add(listener);
}
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
fSelectionListeners.remove(listener);
}
public ISelection getSelection() {
return new StructuredSelection(tableViewer.getCheckedElements());
}
public void setSelection(ISelection selection) {
if (selection instanceof IStructuredSelection) {
if (!selection.equals(fPrevSelection)) {
fPrevSelection = selection;
Object jre = ((IStructuredSelection) selection)
.getFirstElement();
if (jre == null) {
tableViewer.setCheckedElements(new Object[0]);
} else {
tableViewer.setCheckedElements(new Object[] { jre });
tableViewer.reveal(jre);
}
fireSelectionChanged();
}
}
}
public void createControl(Composite ancestor) {
Composite parent = new Composite(ancestor, SWT.NULL);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginHeight = 0;
layout.marginWidth = 0;
parent.setLayout(layout);
Font font = ancestor.getFont();
parent.setFont(font);
fControl = parent;
GridData data;
// Description of the table
Label tableLabel = new Label(parent, SWT.NONE);
tableLabel.setText(Messages.InstalledRuntimesBlock_desc);
data = new GridData();
data.horizontalSpan = 2;
tableLabel.setLayoutData(data);
tableLabel.setFont(font);
Table fTable = new Table(parent, SWT.CHECK | SWT.BORDER
| SWT.FULL_SELECTION | SWT.V_SCROLL);
data = new GridData(GridData.FILL_BOTH);
data.widthHint = 450;
fTable.setLayoutData(data);
fTable.setFont(font);
fTable.setHeaderVisible(true);
fTable.setLinesVisible(true);
// Name column
TableColumn column1 = new TableColumn(fTable, SWT.NONE);
column1.setWidth(180);
column1.setResizable(true);
column1.setText(Messages.InstalledRuntimesBlock_nameColumn);
column1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
sortByName();
}
});
// Installation directory column
TableColumn column2 = new TableColumn(fTable, SWT.NONE);
column2.setWidth(180);
column2.setResizable(true);
column2.setText(Messages.InstalledRuntimesBlock_installDirColumn);
column2.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
sortByInstallDir();
}
});
tableViewer = new CheckboxTableViewer(fTable);
tableViewer.setLabelProvider(new RuntimesLabelProvider());
tableViewer.setContentProvider(new RuntimesContentProvider());
tableViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent evt) {
enableButtons();
}
});
tableViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
if (event.getChecked()) {
setCheckedInstall((MongoRuntime) event.getElement());
} else {
setCheckedInstall(null);
}
}
});
tableViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent e) {
if (!tableViewer.getSelection().isEmpty()) {
editRuntime();
}
}
});
fTable.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent event) {
if (event.character == SWT.DEL && event.stateMask == 0) {
removeRuntimes();
}
}
});
Composite buttons = new Composite(parent, SWT.NULL);
buttons.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
buttons.setLayout(layout);
buttons.setFont(font);
fAddButton = createPushButton(buttons, Messages.addButton);
fAddButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event evt) {
addRuntime();
}
});
fAddButton.setEnabled(true);
fEditButton = createPushButton(buttons, Messages.editButton);
fEditButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event evt) {
editRuntime();
}
});
fRemoveButton = createPushButton(buttons, Messages.removeButton);
fRemoveButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event evt) {
removeRuntimes();
}
});
// copied from ListDialogField.CreateSeparator()
Label separator = new Label(buttons, SWT.NONE);
separator.setVisible(false);
GridData gd = new GridData();
gd.horizontalAlignment = GridData.FILL;
gd.verticalAlignment = GridData.BEGINNING;
gd.heightHint = 4;
separator.setLayoutData(gd);
fillWithWorkspaceRuntimes();
enableButtons();
restoreColumnSettings();
}
protected void fillWithWorkspaceRuntimes() {
setRuntimes(Platform.getMongoRuntimeManager().getRuntimes());
}
private void fireSelectionChanged() {
SelectionChangedEvent event = new SelectionChangedEvent(this,
getSelection());
Object[] listeners = fSelectionListeners.getListeners();
for (Object element : listeners) {
ISelectionChangedListener listener = (ISelectionChangedListener) element;
listener.selectionChanged(event);
}
}
/**
* Sorts by type, and name within type.
*/
// private void sortByType() {
// tableViewer.setSorter(new ViewerSorter() {
// @Override
// public int compare(Viewer viewer, Object e1, Object e2) {
// MongoRuntime left = (MongoRuntime) e1;
// MongoRuntime right = (MongoRuntime) e2;
// return left
// .getRuntimeType()
// .getLabel()
// .compareToIgnoreCase(
// right.getRuntimeType().getLabel());
// }
//
// @Override
// public boolean isSorterProperty(Object element, String property) {
// return true;
// }
// });
// }
private void sortByInstallDir() {
tableViewer.setSorter(new ViewerSorter() {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
MongoRuntime left = (MongoRuntime) e1;
MongoRuntime right = (MongoRuntime) e2;
return left.getInstallDir().compareToIgnoreCase(
right.getInstallDir());
}
@Override
public boolean isSorterProperty(Object element, String property) {
return true;
}
});
}
/**
* Sorts by name.
*/
private void sortByName() {
tableViewer.setSorter(new ViewerSorter() {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
if ((e1 instanceof MongoRuntime)
&& (e2 instanceof MongoRuntime)) {
MongoRuntime left = (MongoRuntime) e1;
MongoRuntime right = (MongoRuntime) e2;
return left.getName().compareToIgnoreCase(right.getName());
}
return super.compare(viewer, e1, e2);
}
@Override
public boolean isSorterProperty(Object element, String property) {
return true;
}
});
}
private void enableButtons() {
IStructuredSelection selection = (IStructuredSelection) tableViewer
.getSelection();
int selectionCount = selection.size();
fEditButton.setEnabled(selectionCount == 1);
fRemoveButton.setEnabled(selectionCount == 1);
// if (selectionCount > 0
// && selectionCount < tableViewer.getTable().getItemCount()) {
// //Iterator<?> iterator = selection.iterator();
//// while (iterator.hasNext()) {
//// MongoRuntime install = (MongoRuntime) iterator.next();
//// // if (install.isContributed()) {
//// fRemoveButton.setEnabled(false);
//// return;
//// // }
//// }
// fRemoveButton.setEnabled(true);
// } else {
// fRemoveButton.setEnabled(false);
// }
}
protected Button createPushButton(Composite parent, String label) {
Button button = new Button(parent, SWT.PUSH);
button.setText(label);
button.setLayoutData(GridDataFactory.fillDefaults().create());
return button;
}
public Control getControl() {
return fControl;
}
protected void setRuntimes(List<MongoRuntime> vms) {
runtimes.clear();
for (MongoRuntime element : vms) {
runtimes.add(element);
}
tableViewer.setInput(runtimes);
// tableViewer.refresh();
}
public MongoRuntime[] getRuntimes() {
return runtimes.toArray(new MongoRuntime[runtimes.size()]);
}
private void addRuntime() {
AddRuntimeDialog dialog = new AddRuntimeDialog(fAddButton.getShell());
if (dialog.open() == Window.OK) {
runtimeAdded(dialog.getRuntime());
}
}
public void runtimeAdded(MongoRuntime install) {
runtimes.add(install);
tableViewer.add(install);
tableViewer.setSelection(new StructuredSelection(install), true);
}
public boolean isDuplicateName(String name) {
for (int i = 0; i < runtimes.size(); i++) {
MongoRuntime install = runtimes.get(i);
if (install.getName().equals(name)) {
return true;
}
}
return false;
}
private void editRuntime() {
IStructuredSelection selection = (IStructuredSelection) tableViewer
.getSelection();
MongoRuntime runtime = (MongoRuntime) selection.getFirstElement();
if (runtime == null) {
return;
}
AddRuntimeDialog dialog = new AddRuntimeDialog(fAddButton.getShell(),
runtime);
if (dialog.open() == Window.OK) {
// refresh viewer
tableViewer.refresh(runtime);
}
}
private void removeRuntimes() {
IStructuredSelection selection = (IStructuredSelection) tableViewer
.getSelection();
MongoRuntime[] vms = new MongoRuntime[selection.size()];
Iterator<?> iter = selection.iterator();
int i = 0;
while (iter.hasNext()) {
vms[i] = (MongoRuntime) iter.next();
i++;
}
removeRuntimes(vms);
}
public void removeRuntimes(MongoRuntime[] theInstalls) {
IStructuredSelection prev = (IStructuredSelection) getSelection();
for (MongoRuntime element : theInstalls) {
runtimes.remove(element);
}
tableViewer.refresh();
IStructuredSelection curr = (IStructuredSelection) getSelection();
if (!curr.equals(prev)) {
MongoRuntime[] installs = getRuntimes();
if (curr.size() == 0 && installs.length == 1) {
// pick a default install automatically
setSelection(new StructuredSelection(installs[0]));
} else {
fireSelectionChanged();
}
}
}
public void setCheckedInstall(MongoRuntime install) {
if (install == null) {
setSelection(new StructuredSelection());
} else {
setSelection(new StructuredSelection(install));
}
}
public MongoRuntime getCheckedInstall() {
Object[] objects = tableViewer.getCheckedElements();
if (objects.length == 0) {
return null;
}
return (MongoRuntime) objects[0];
}
@Override
protected void setSortColumn(int column) {
switch (column) {
case 1:
sortByName();
break;
// case 2:
// sortByType();
// break;
}
super.setSortColumn(column);
}
@Override
protected Table getTable() {
return tableViewer.getTable();
}
@Override
protected IDialogSettings getDialogSettings() {
return Activator.getDefault().getDialogSettings();
}
private class RuntimesContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object input) {
return runtimes.toArray();
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void dispose() {
}
}
private static class RuntimesLabelProvider extends LabelProvider implements
ITableLabelProvider {
public String getColumnText(Object element, int columnIndex) {
if (element instanceof MongoRuntime) {
MongoRuntime install = (MongoRuntime) element;
switch (columnIndex) {
case 0:
return install.getName();
case 1:
return install.getInstallDir();
// case 2:
// if (install.getDebugger() != null)
// {
// return install.getDebugger().getName();
// }
// return Messages.InstalledRuntimesBlock_8;
}
}
return element.toString();
}
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
}
@Override
protected String getQualifier() {
return "";
}
}