/** * */ package com.netifera.platform.ui.tasks.list; import java.util.HashMap; import java.util.Map; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import com.netifera.platform.api.tasks.ITaskRecord; import com.netifera.platform.tasks.TaskStatus; /** * @author kevin * */ public class TaskFilter extends ViewerFilter { private Map<Integer,Boolean> filterMap = new HashMap<Integer,Boolean>(); private volatile boolean changed = false; private Viewer viewer; public void filter(int runState, boolean filter) { Boolean prev = filterMap.put(runState, filter); changed = (prev == null || prev != filter); } @Override public boolean select(Viewer viewer, Object parentElement, Object element) { this.viewer = viewer; if(element instanceof ITaskRecord) { int runState = ((ITaskRecord)element).getRunState(); if(filterMap.containsKey(runState)) { return filterMap.get(runState); } return true; } return true; } /* used to know if filter setting changed without adding a method and a cast * in general content provider code */ @Override public boolean isFilterProperty(Object element, String property) { if(element == null && property == null) { return changed; } return false; } public void fillFilterMenu(IMenuManager menuMgr) { menuMgr.add(createAction("Running", TaskStatus.RUNNING)); menuMgr.add(createAction("Waiting", TaskStatus.WAITING)); menuMgr.add(createAction("Finished", TaskStatus.FINISHED)); menuMgr.add(createAction("Failed", TaskStatus.FAILED)); } private Action createAction(final String text, final int filterType) { Action action = new Action(text, Action.AS_CHECK_BOX) { @Override public void run() { filter(filterType, this.isChecked()); if(viewer != null) { viewer.refresh(); } } }; boolean checked = filterMap.containsKey(filterType) ? filterMap.get(filterType) : true; action.setChecked(checked); return action; } }