package bndtools.editor.common; import java.util.ArrayList; import java.util.List; import org.bndtools.utils.collections.CollectionUtils; import org.eclipse.jface.viewers.TableViewer; 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.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.ui.plugin.AbstractUIPlugin; import bndtools.Plugin; public class UpDownButtonBarPart { private final Image imgUp = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "/icons/arrow_up.png").createImage(); private final Image imgDown = AbstractUIPlugin.imageDescriptorFromPlugin(Plugin.PLUGIN_ID, "/icons/arrow_down.png").createImage(); public static interface UpDownListener { void changed(List<Object> list); } private final TableViewer viewer; private final List<UpDownListener> listeners = new ArrayList<>(); private ToolBar toolbar; private ToolItem btnUp; private ToolItem btnDown; public UpDownButtonBarPart(TableViewer viewer) { this.viewer = viewer; } public Control createControl(Composite parent, int style) { toolbar = new ToolBar(parent, style); btnUp = new ToolItem(toolbar, SWT.PUSH); btnUp.setImage(imgUp); btnUp.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { doMoveUp(); } }); btnDown = new ToolItem(toolbar, SWT.PUSH); btnDown.setImage(imgDown); btnDown.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { doMoveDown(); } }); toolbar.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent de) { if (!imgUp.isDisposed()) imgUp.dispose(); if (!imgDown.isDisposed()) imgDown.dispose(); } }); return toolbar; } public void setEnabledUp(boolean enabled) { btnUp.setEnabled(enabled); } public void setEnabledDown(boolean enabled) { btnDown.setEnabled(enabled); } private void doMoveUp() { int[] indexes = viewer.getTable().getSelectionIndices(); @SuppressWarnings("unchecked") List<Object> list = (List<Object>) viewer.getInput(); if (CollectionUtils.moveUp(list, indexes)) { viewer.setInput(list); for (UpDownListener l : listeners) { l.changed(list); } } } private void doMoveDown() { int[] indexes = viewer.getTable().getSelectionIndices(); @SuppressWarnings("unchecked") List<Object> list = (List<Object>) viewer.getInput(); if (CollectionUtils.moveDown(list, indexes)) { viewer.setInput(list); for (UpDownListener l : listeners) { l.changed(list); } } } public void addListener(UpDownListener l) { listeners.add(l); } public void removeListener(UpDownListener l) { listeners.remove(l); } }