/***************************************************************************** * Copyright (c) 2006-2013, Cloudsmith Inc. * The code, documentation and other materials contained herein have been * licensed under the Eclipse Public License - v 1.0 by the copyright holder * listed above, as the Initial Contributor under such license. The text of * such license is available at www.eclipse.org. *****************************************************************************/ package org.eclipse.buckminster.ui.prefs; import java.util.ArrayList; import org.eclipse.buckminster.core.resolver.ResolverFactoryMaintainer; import org.eclipse.buckminster.runtime.BuckminsterPreferences; import org.eclipse.buckminster.runtime.Trivial; import org.eclipse.buckminster.ui.Messages; import org.eclipse.buckminster.ui.UiUtils; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Group; import org.eclipse.swt.widgets.List; /** * @author Thomas Hallgren * */ public class ResolutionResolverListEditor extends FieldEditor { private String value; private Button addButton; private Button moveDownButton; private Button moveUpButton; private ListViewer queryResolvers; private ListViewer queryResolversToAdd; private String[] registeredResolverFactories; private Button removeButton; private Group resolveOrderGroup; public ResolutionResolverListEditor(String name, String labelText, Composite parent) { init(name, labelText); createControl(parent); } public Control getControl(Composite parent, int numColumns) { if (resolveOrderGroup == null) { resolveOrderGroup = new Group(parent, SWT.NONE); resolveOrderGroup.setLayout(new GridLayout(3, false)); resolveOrderGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, numColumns, 1)); resolveOrderGroup.setText(Messages.order_of_resolution); queryResolvers = new ListViewer(resolveOrderGroup, SWT.BORDER); queryResolvers.getList().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); queryResolvers.setContentProvider(new ArrayContentProvider()); queryResolvers.setLabelProvider(new LabelProvider()); queryResolvers.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { enableDisableUpDownButtons(true); } }); Composite buttonBox = new Composite(resolveOrderGroup, SWT.NONE); buttonBox.setLayout(new GridLayout(1, true)); buttonBox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true)); addButton = UiUtils.createPushButton(buttonBox, Messages.add_with_arrow_left, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { addResolver(); } }); addButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); removeButton = UiUtils.createPushButton(buttonBox, Messages.remove_with_arrow_right, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { removeResolver(); } }); removeButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); moveUpButton = UiUtils.createPushButton(buttonBox, Messages.move_up, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { swapAndReselect(0, -1); } }); moveUpButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); moveDownButton = UiUtils.createPushButton(buttonBox, Messages.move_down, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { swapAndReselect(1, 0); } }); moveDownButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); queryResolversToAdd = new ListViewer(resolveOrderGroup, SWT.BORDER); queryResolversToAdd.getList().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); queryResolversToAdd.setContentProvider(new ArrayContentProvider()); queryResolversToAdd.setLabelProvider(new LabelProvider()); queryResolversToAdd.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { enableDisableUpDownButtons(false); } }); } return resolveOrderGroup; } @Override public int getNumberOfControls() { return 1; } @Override protected void adjustForNumColumns(int numColumns) { ((GridData) resolveOrderGroup.getLayoutData()).horizontalSpan = numColumns; } @Override protected void doFillIntoGrid(Composite parent, int numColumns) { getControl(parent, numColumns); } @Override protected void doLoad() { loadLists(getPreferenceStore().getString(getPreferenceName())); } @Override protected void doLoadDefault() { ResolverFactoryMaintainer.getInstance().setDefaultResolutionOrder(); loadLists(getPreferenceStore().getString(getPreferenceName())); } @Override protected void doStore() { String v = BuckminsterPreferences.createQueryResolverSortOrder((queryResolvers == null) ? getRegisteredResolverFactories() : queryResolvers .getList().getItems()); IPreferenceStore store = getPreferenceStore(); String prefName = getPreferenceName(); if (v == null) { store.setToDefault(prefName); BuckminsterPreferences.setCustomQueryResolverSortOrder(false); } else { if (v.equals(store.getString(prefName))) return; store.setValue(prefName, v); BuckminsterPreferences.setCustomQueryResolverSortOrder(true); } } void addResolver() { moveItem(queryResolversToAdd, queryResolvers); } void enableDisableUpDownButtons(boolean fromResolvers) { String oldValue = value; List list = queryResolvers.getList(); int top = list.getItemCount(); int idx = list.getSelectionIndex(); if (fromResolvers) { value = idx >= 0 ? list.getItem(idx) : null; if (!Trivial.equalsAllowNull(oldValue, value)) fireValueChanged(VALUE, oldValue, value); } List addList = queryResolversToAdd.getList(); addButton.setEnabled(addList.getItemCount() > 0 && addList.getSelectionIndex() >= 0); moveUpButton.setEnabled(idx > 0); removeButton.setEnabled(idx >= 0); moveDownButton.setEnabled(idx >= 0 && idx < top - 1); } void removeResolver() { moveItem(queryResolvers, queryResolversToAdd); } void swapAndReselect(int idxOffset, int selectionOffset) { List list = queryResolvers.getList(); int idx = list.getSelectionIndex() + idxOffset; if (idx <= 0) return; String[] items = list.getItems(); if (idx >= items.length) return; String moved = items[idx - 1]; items[idx - 1] = items[idx]; items[idx] = moved; list.setItems(items); list.select(idx + selectionOffset); enableDisableUpDownButtons(true); } private String[] getPossibleResolverAdditions() { String[] registered = getRegisteredResolverFactories(); String[] current = queryResolvers.getList().getItems(); ArrayList<String> possible = null; for (String name : registered) { boolean found = false; for (String currName : current) if (currName.equals(name)) { found = true; break; } if (found) continue; if (possible == null) possible = new ArrayList<String>(); possible.add(name); } return possible == null ? Trivial.EMPTY_STRING_ARRAY : possible.toArray(new String[possible.size()]); } private synchronized String[] getRegisteredResolverFactories() { if (registeredResolverFactories == null) registeredResolverFactories = ResolverFactoryMaintainer.getRegisterFactoryIDs(); return registeredResolverFactories; } private void loadLists(String prefValue) { String[] resolvers = (prefValue == null || prefValue.length() == 0) ? Trivial.EMPTY_STRING_ARRAY : prefValue.split(","); //$NON-NLS-1$ queryResolvers.setInput(resolvers); queryResolvers.getList().select(0); queryResolversToAdd.setInput(getPossibleResolverAdditions()); enableDisableUpDownButtons(true); } private void moveItem(ListViewer from, ListViewer to) { List list = from.getList(); int idx = list.getSelectionIndex(); if (idx < 0) return; to.add(list.getItem(idx)); list.remove(idx); int top = list.getItemCount(); if (idx >= top) idx = top - 1; if (idx >= 0) list.select(idx); enableDisableUpDownButtons(true); } }