/**
*
*/
package com.netifera.platform.ui.tasks.output;
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.tasks.TaskLogOutput;
/**
* @author kevin
*
*/
public class TaskOutputFilter extends ViewerFilter {
private long filterMap;
private volatile boolean changed = false;
private Viewer viewer;
public void filter(int level, boolean filter) {
long prev = filterMap;
long mask = 1 << level;
filterMap |= mask;
filterMap -= filter ? mask : 0;
changed = (filterMap != prev);
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
this.viewer = viewer;
if(element instanceof TaskLogOutput) {
TaskLogOutput msg = (TaskLogOutput)element;
//LogLevel level = ((TaskLogMessage)element).getLogLevel();
//return((filterMap & 1<<level.ordinal()) == 0);
return((filterMap & 1 << msg.getLogLevel()) == 0);
}
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("Debug",TaskLogOutput.DEBUG));
menuMgr.add(createAction("Information",TaskLogOutput.INFO));
menuMgr.add(createAction("Warning",TaskLogOutput.WARNING));
menuMgr.add(createAction("Error",TaskLogOutput.ERROR));
}
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 & 1 << filterType) == 0);
action.setChecked(checked);
return action;
}
}