package org.csstudio.sds.ui.sdslibrary.preferences;
import java.util.ArrayList;
import java.util.List;
import org.csstudio.sds.ui.SdsUiPlugin;
import org.csstudio.ui.util.dialogs.ResourceSelectionDialog;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
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.Listener;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
public class LibraryFolderPreferencePage extends PreferencePage implements
IWorkbenchPreferencePage {
private final LibraryFolderPreferenceService libraryFolderPreferenceService;
private Button removeFolderButton;
private Button moveFolderUpButton;
private Button moveFolderDownButton;
private CheckboxTableViewer tableViewer;
public LibraryFolderPreferencePage() {
super();
libraryFolderPreferenceService = SdsUiPlugin.getDefault()
.getLibraryFolderPreferenceService();
setTitle("Template Library Preferences");
setDescription("Select folders containing templates");
}
@Override
protected Control createContents(Composite parent) {
Composite mainComposite = new Composite(parent, NONE);
mainComposite.setLayout(new GridLayout(2, false));
GridData gd = new GridData(GridData.FILL_BOTH);
gd.horizontalSpan = 1;
mainComposite.setLayoutData(gd);
createListTableViewer(mainComposite);
createButtons(mainComposite);
return mainComposite;
}
@Override
public void init(IWorkbench workbench) {
}
@Override
public boolean performOk() {
libraryFolderPreferenceService
.saveLibraryFolderPreferenceItems(getAllItems());
return true;
}
protected List<LibraryFolderPreferenceItem> getAllItems() {
TableItem[] items = tableViewer.getTable().getItems();
List<LibraryFolderPreferenceItem> result = new ArrayList<LibraryFolderPreferenceItem>(
items.length);
for (int i = 0; i < items.length; i++) {
result.add((LibraryFolderPreferenceItem) items[i].getData());
}
return result;
}
private void createListTableViewer(Composite container) {
tableViewer = CheckboxTableViewer.newCheckList(container, SWT.H_SCROLL
| SWT.V_SCROLL | SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
tableViewer.getTable().setFont(container.getFont());
LibraryFolderPreferenceLabelProvider libraryFolderPreferenceProvider = new LibraryFolderPreferenceLabelProvider();
tableViewer.setLabelProvider(libraryFolderPreferenceProvider);
tableViewer.setCheckStateProvider(libraryFolderPreferenceProvider);
tableViewer.setContentProvider(new IStructuredContentProvider() {
@Override
public void inputChanged(Viewer viewer, Object oldInput,
Object newInput) {
}
@Override
public void dispose() {
}
@Override
public Object[] getElements(Object inputElement) {
List<?> elements = (List<?>) inputElement;
return elements.toArray();
}
});
tableViewer.setInput(libraryFolderPreferenceService.loadLibraryItems());
tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
tableViewer.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
LibraryFolderPreferenceItem item = (LibraryFolderPreferenceItem) event
.getElement();
item.setChecked(event.getChecked());
}
});
tableViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
updateButtons();
}
});
}
private void updateButtons() {
if (tableViewer.getSelection().isEmpty()) {
removeFolderButton.setEnabled(false);
moveFolderDownButton.setEnabled(false);
moveFolderUpButton.setEnabled(false);
} else {
int selectionIndex = tableViewer.getTable()
.getSelectionIndex();
boolean enableMoveUp = !(selectionIndex == 0);
boolean enableMoveDown = !(selectionIndex == tableViewer
.getTable().getItemCount() - 1);
removeFolderButton.setEnabled(true);
moveFolderDownButton.setEnabled(enableMoveDown);
moveFolderUpButton.setEnabled(enableMoveUp);
}
}
private void createButtons(Composite container) {
initializeDialogUnits(container);
// button container
Composite buttonContainer = new Composite(container, SWT.NONE);
GridData gd = new GridData(GridData.FILL_VERTICAL);
buttonContainer.setLayoutData(gd);
GridLayout buttonLayout = new GridLayout();
buttonLayout.numColumns = 1;
buttonLayout.marginHeight = 0;
buttonLayout.marginWidth = 0;
buttonContainer.setLayout(buttonLayout);
// Add folder button
Button addFolderButton = createPushButton(buttonContainer, "Add folder", true);
addFolderButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event e) {
String addedFolder = addFolderPressed();
if (addedFolder != null) {
LibraryFolderPreferenceItem newItem = new LibraryFolderPreferenceItem(
addedFolder);
// don't add selected folder if it's already been added
boolean alreadyContainsItem = false;
for (LibraryFolderPreferenceItem item : getAllItems()) {
if(item.getFolderPath().equals(newItem.getFolderPath())) {
alreadyContainsItem = true;
break;
}
}
if(!alreadyContainsItem) {
tableViewer.add(newItem);
}
}
}
});
removeFolderButton = createPushButton(buttonContainer, "Remove folder", false);
removeFolderButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event e) {
if(!tableViewer.getSelection().isEmpty()) {
tableViewer.getTable().remove(tableViewer.getTable().getSelectionIndex());
updateButtons();
}
}
});
moveFolderUpButton = createPushButton(buttonContainer, "Move folder up", false);
moveFolderUpButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event e) {
int selectionIndex = tableViewer.getTable().getSelectionIndex();
moveObjectAtIndex(selectionIndex, false);
}
});
moveFolderDownButton = createPushButton(buttonContainer,
"Move folder down", false);
moveFolderDownButton.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event e) {
int selectionIndex = tableViewer.getTable().getSelectionIndex();
if (selectionIndex < tableViewer.getTable().getItemCount() - 1) {
moveObjectAtIndex(selectionIndex, true);
}
}
});
}
private void moveObjectAtIndex(int selectionIndex, boolean moveDown) {
int moveOffset = moveDown ? 1 : -1;
TableItem selectedItem = tableViewer.getTable().getItem(selectionIndex);
LibraryFolderPreferenceItem selectedPreferenceItem = (LibraryFolderPreferenceItem) selectedItem
.getData();
tableViewer.remove(selectedPreferenceItem);
tableViewer.insert(selectedPreferenceItem, selectionIndex + moveOffset);
tableViewer
.setSelection(new StructuredSelection(selectedPreferenceItem));
}
private Button createPushButton(Composite parent, String label, boolean enabled) {
Button button = new Button(parent, SWT.PUSH);
button.setEnabled(enabled);
button.setFont(parent.getFont());
if (label != null) {
button.setText(label);
}
GridData gd = new GridData();
gd.horizontalAlignment = GridData.FILL;
button.setLayoutData(gd);
return button;
}
protected String addFolderPressed() {
ResourceSelectionDialog resourceSelectionDialog = new ResourceSelectionDialog(
getShell(), "Select a folder which contains rules", null);
if (resourceSelectionDialog.open() == Window.OK) {
IPath selectedResource = resourceSelectionDialog
.getSelectedResource();
return selectedResource.toString();
}
return null;
}
}