/**
* Copyright (c) 2010, 2013 Darmstadt University of Technology.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Olav Lenz - initial API and implementation.
*/
package org.eclipse.recommenders.internal.coordinates.rcp;
import static java.lang.Math.*;
import static org.eclipse.recommenders.utils.Checks.cast;
import java.util.List;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.recommenders.internal.coordinates.rcp.l10n.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import com.google.common.collect.Lists;
public class AdvisorsPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
private static final int UP = -1;
private static final int DOWN = +1;
public AdvisorsPreferencePage() {
super(GRID);
}
@Override
public void init(IWorkbench workbench) {
setPreferenceStore(new ScopedPreferenceStore(InstanceScope.INSTANCE, Constants.BUNDLE_ID));
setMessage(Messages.PREFPAGE_TITLE_ADVISORS);
setDescription(Messages.PREFPAGE_DESCRIPTION_ADVISORS);
}
@Override
protected void createFieldEditors() {
addField(new AdvisorEditor(Constants.PREF_SORTED_ADVISOR_LIST, Messages.FIELD_LABEL_ADVISORS,
getFieldEditorParent()));
Dialog.applyDialogFont(getControl());
}
private static final class AdvisorEditor extends FieldEditor {
private CheckboxTableViewer tableViewer;
private Composite buttonBox;
private Button upButton;
private Button downButton;
private AdvisorEditor(String name, String labelText, Composite parent) {
super(name, labelText, parent);
}
@Override
protected void adjustForNumColumns(int numColumns) {
}
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
Control control = getLabelControl(parent);
GridDataFactory.swtDefaults().span(numColumns, 1).applyTo(control);
tableViewer = getTableControl(parent);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).span(numColumns - 1, 1).grab(true, false)
.applyTo(tableViewer.getTable());
tableViewer.getTable().addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateButtonStatus();
}
});
buttonBox = getButtonControl(parent);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).applyTo(buttonBox);
}
private void updateButtonStatus() {
int selectionIndex = tableViewer.getTable().getSelectionIndex();
upButton.setEnabled(selectionIndex != -1 && selectionIndex > 0);
downButton.setEnabled(selectionIndex != -1 && selectionIndex < tableViewer.getTable().getItemCount() - 1);
}
private final class MoveSelectionListener extends SelectionAdapter {
private final int direction;
public MoveSelectionListener(int direction) {
this.direction = direction;
}
@Override
public void widgetSelected(SelectionEvent e) {
List<AdvisorDescriptor> input = cast(tableViewer.getInput());
int index = tableViewer.getTable().getSelectionIndex();
AdvisorDescriptor movedElement = input.remove(index);
int newIndex = min(max(0, index + direction), input.size());
input.add(newIndex, movedElement);
tableViewer.setInput(input);
updateButtonStatus();
}
}
private Composite getButtonControl(Composite parent) {
Composite box = new Composite(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().applyTo(box);
upButton = createUpDownButton(box, Messages.BUTTON_LABEL_UP, UP);
downButton = createUpDownButton(box, Messages.BUTTON_LABEL_DOWN, DOWN);
return box;
}
private Button createUpDownButton(Composite box, String text, int mode) {
Button button = new Button(box, SWT.PUSH);
button.setText(text);
button.setEnabled(false);
button.addSelectionListener(new MoveSelectionListener(mode));
int widthHint = Math.max(convertHorizontalDLUsToPixels(button, IDialogConstants.BUTTON_WIDTH),
button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER).hint(widthHint, SWT.DEFAULT).applyTo(button);
return button;
}
private CheckboxTableViewer getTableControl(Composite parent) {
CheckboxTableViewer tableViewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER | SWT.FULL_SELECTION);
tableViewer.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
AdvisorDescriptor descriptor = cast(element);
return descriptor.getName();
}
@Override
public String getToolTipText(Object element) {
AdvisorDescriptor descriptor = cast(element);
return descriptor.getDescription();
}
});
ColumnViewerToolTipSupport.enableFor(tableViewer);
tableViewer.setContentProvider(new ArrayContentProvider());
return tableViewer;
}
@Override
protected void doLoad() {
String value = getPreferenceStore().getString(getPreferenceName());
load(value);
}
private void load(String value) {
List<AdvisorDescriptor> input = AdvisorDescriptors.load(value, AdvisorDescriptors.getRegisteredAdvisors());
List<AdvisorDescriptor> checkedElements = Lists.newArrayList();
for (AdvisorDescriptor descriptor : input) {
if (descriptor.isEnabled()) {
checkedElements.add(descriptor);
}
}
tableViewer.setInput(input);
tableViewer.setCheckedElements(checkedElements.toArray());
}
@Override
protected void doLoadDefault() {
String value = getPreferenceStore().getDefaultString(getPreferenceName());
load(value);
}
@Override
protected void doStore() {
List<AdvisorDescriptor> descriptors = cast(tableViewer.getInput());
for (AdvisorDescriptor descriptor : descriptors) {
descriptor.setEnabled(tableViewer.getChecked(descriptor));
}
String newValue = AdvisorDescriptors.store(descriptors);
getPreferenceStore().setValue(getPreferenceName(), newValue);
}
@Override
public int getNumberOfControls() {
return 2;
}
}
}