package edu.ualberta.med.biobank.preferences; import java.util.StringTokenizer; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.ListEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.List; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.PlatformUI; import edu.ualberta.med.biobank.BiobankPlugin; import edu.ualberta.med.biobank.dialogs.NewServerDialog; public class ServerPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { private class BiobankListEditor extends ListEditor { /* * This class uses code from * http://sandipchitale.blogspot.com/2008/09/enhanced * -listeditor-implementation.html */ private Button editButton; private List commandListControl; public BiobankListEditor(String serverList, String title, Composite parent) { super(serverList, title, parent); } @Override protected String createList(String[] items) { StringBuffer appendedList = new StringBuffer(); for (int i = 0; i < items.length; i++) { appendedList.append(items[i]); if (i < items.length - 1) appendedList.append("\n"); //$NON-NLS-1$ } return appendedList.toString(); } /** * Helper method to create a push button. * * @param parent the parent control * @param key the resource name used to supply the button's label text * @return Button */ private Button createPushButton(Composite parent, String key) { Button button = new Button(parent, SWT.PUSH); button.setText(key); button.setFont(parent.getFont()); GridData data = new GridData(GridData.FILL_HORIZONTAL); int widthHint = convertHorizontalDLUsToPixels(button, IDialogConstants.BUTTON_WIDTH); data.widthHint = Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x); button.setLayoutData(data); return button; } @Override public List getListControl(Composite parent) { List listControl = super.getListControl(parent); if (commandListControl == null) { commandListControl = listControl; commandListControl.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { editButton.setEnabled(commandListControl .getSelectionCount() == 1); } }); } return listControl; } @Override public Composite getButtonBoxControl(Composite parent) { Composite buttonBoxControl = super.getButtonBoxControl(parent); if (editButton == null) { editButton = createPushButton(buttonBoxControl, Messages.ServerPreferencePage_edit_button_label); editButton.setEnabled(false); editButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (commandListControl.getSelectionCount() == 1) { String modified = getModifiedEntry(commandListControl .getSelection()[0]); if (modified != null) { int selectedIndex = commandListControl .getSelectionIndex(); commandListControl.remove(selectedIndex); commandListControl.add(modified, selectedIndex); } } } }); buttonBoxControl.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent event) { editButton = null; } }); } return buttonBoxControl; } protected String getModifiedEntry(String original) { InputDialog entryDialog = new InputDialog(PlatformUI.getWorkbench() .getActiveWorkbenchWindow().getShell(), Messages.ServerPreferencePage_edit_dialog_title, Messages.ServerPreferencePage_edit_dialog_msg, original, null); if (entryDialog.open() == InputDialog.OK) { return entryDialog.getValue(); } return null; } @Override protected String getNewInputObject() { NewServerDialog dlg = new NewServerDialog(getFieldEditorParent() .getShell()); if (dlg.open() == Dialog.OK) { return dlg.getServerAddress(); } return null; } @Override protected String[] parseString(String stringList) { StringTokenizer st = new StringTokenizer(stringList, "\n"); //$NON-NLS-1$ String[] items = new String[st.countTokens()]; int i = 0; while (st.hasMoreTokens()) { items[i++] = st.nextToken(); } return items; } } public ServerPreferencePage() { super(GRID); setPreferenceStore(BiobankPlugin.getDefault().getPreferenceStore()); } @Override protected void createFieldEditors() { addField(new BiobankListEditor(PreferenceConstants.SERVER_LIST, Messages.ServerPreferencePage_servers_label, getFieldEditorParent())); } @Override public void init(IWorkbench workbench) { } }