package de.urszeidler.shr5.ecp.editor.widgets; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.wb.swt.ResourceManager; import de.urszeidler.shr5.ecp.util.DefaultLabelProvider; import de.urszeidler.shr5.ecp.util.DropdownSelectionListener; /** * A Filter dropdown. * * @author urs * @param <A> */ public abstract class FilterDropdownSelectionListener<A> extends DropdownSelectionListener<A> { private static final String ENTRY = "entry"; private boolean filterActive = true; private ILabelProvider labelprovider = new DefaultLabelProvider(); private Set<A> filterValueList = new HashSet<A>(); public FilterDropdownSelectionListener(ToolItem dropdown) { super(dropdown); Collection<A> sourceBooks = getFilterItems(); for (A sourceBook : sourceBooks) { add(labelprovider.getText(sourceBook), sourceBook); filterValueList.add(sourceBook); } MenuItem menuItem = new MenuItem(menu, SWT.SEPARATOR); menuItem = new MenuItem(menu, SWT.NONE); menuItem.setText("filter none"); menuItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { MenuItem[] items = menu.getItems(); for (int i = 0; i < items.length; i++) { MenuItem menuItem1 = items[i]; Object data = menuItem1.getData(ENTRY); if (data != null) { filterValueList.remove(data); menuItem1.notifyListeners(SWT.Selection, new Event()); } } } }); menuItem = new MenuItem(menu, SWT.NONE); menuItem.setText("filter all"); menuItem.addSelectionListener(new SelectionAdapter() { @SuppressWarnings("unchecked") public void widgetSelected(SelectionEvent event) { MenuItem[] items = menu.getItems(); for (int i = 0; i < items.length; i++) { MenuItem menuItem1 = items[i]; Object data = menuItem1.getData(ENTRY); if (data != null) { filterValueList.add((A)data); menuItem1.notifyListeners(SWT.Selection, new Event()); } } } }); } /** * @return */ protected abstract Collection<A> getFilterItems(); /** * Add the filter to the widget. */ protected abstract void addFilterToWidget(); /** * Remove the filter to the widget. */ protected abstract void removeFilterFromWidget(); /** * Refreshes the filtererd viewer. */ protected abstract void refreshViewer(); @Override public void buttonPushed() { if (filterActive) { removeFilterFromWidget(); refreshViewer(); dropdown.setImage(ResourceManager.getPluginImage("de.urszeidler.shr5.ecp", "images/filter_off.gif")); filterActive = false; } else { addFilterToWidget(); refreshViewer(); dropdown.setImage(ResourceManager.getPluginImage("de.urszeidler.shr5.ecp", "images/filter_on.gif")); filterActive = true; } } @Override public void add(String item, final A action) { final MenuItem menuItem = new MenuItem(menu, SWT.NONE); menuItem.setText(item); menuItem.setData(ENTRY, action); filterValueList.add(action); menuItem.setImage(labelprovider.getImage(action)); menuItem.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { if (filterValueList.contains(action)) { menuItem.setImage(ResourceManager.decorateImage(labelprovider.getImage(action), ResourceManager.getPluginImage("de.urszeidler.shr5.ecp", "images/overlay-critical.gif"))); filterValueList.remove(action); } else { menuItem.setImage(labelprovider.getImage(action)); filterValueList.add(action); } refreshViewer(); } }); } public Set<A> getFilterValues() { return filterValueList; } }