package org.csstudio.sds.ui.internal.pvlistview.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.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 PvSearchFolderPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private final PvSearchFolderPreferenceService pvSearchFolderPreferenceService; private Button removeFolderButton; private CheckboxTableViewer tableViewer; public PvSearchFolderPreferencePage() { super(); pvSearchFolderPreferenceService = SdsUiPlugin.getDefault() .getPvSearchFolderPreferenceService(); setTitle("Process Variable Search Preferences"); setDescription("Select folders to use for default PV searches"); } @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() { pvSearchFolderPreferenceService .saveLibraryFolderPreferenceItems(getAllItems()); return true; } protected List<PvSearchFolderPreferenceItem> getAllItems() { TableItem[] items = tableViewer.getTable().getItems(); List<PvSearchFolderPreferenceItem> result = new ArrayList<PvSearchFolderPreferenceItem>( items.length); for (int i = 0; i < items.length; i++) { result.add((PvSearchFolderPreferenceItem) 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()); PvSearchFolderPreferenceLabelProvider libraryFolderPreferenceProvider = new PvSearchFolderPreferenceLabelProvider(); 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(pvSearchFolderPreferenceService.loadPvSearchItems()); tableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); tableViewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { PvSearchFolderPreferenceItem item = (PvSearchFolderPreferenceItem) event .getElement(); item.setChecked(event.getChecked()); } }); tableViewer .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { updateButtons(); } }); } private void updateButtons() { removeFolderButton.setEnabled(!tableViewer.getSelection().isEmpty()); } 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) { PvSearchFolderPreferenceItem newItem = new PvSearchFolderPreferenceItem( addedFolder); // don't add selected folder if it's already been added boolean alreadyContainsItem = false; for (PvSearchFolderPreferenceItem 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(); } } }); } 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; } }