/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.log.internal;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.osgi.service.log.LogService;
import de.rcenvironment.core.log.SerializableLogEntry;
/**
* Listener for GUI-elements such as check box, drop down box, and text field to realize changes. In case of changes it pushes to refresh
* displaying the data and organizes filtering table data.
*
* @author Enrico Tappert
*/
public class LogTableFilter extends ViewerFilter implements SelectionListener, KeyListener {
/** Constant. */
private static final String Filter = ".*";
private boolean myErrorSetup;
private boolean myInfoSetup;
private boolean myWarnSetup;
private LogView myLoggingView;
private String mySearchTerm;
private TableViewer myTableViewer;
private Pattern myPattern;
public LogTableFilter(LogView loggingView, TableViewer tableViewer) {
myLoggingView = loggingView;
myTableViewer = tableViewer;
updateTableView();
myTableViewer.getTable().setFocus();
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
boolean returnValue = false;
if (element instanceof SerializableLogEntry) {
SerializableLogEntry logEntry = (SerializableLogEntry) element;
if (isLevelSelected(logEntry.getLevel())) {
returnValue = isSelectedBySearchTerm(logEntry.getMessage());
}
}
return returnValue;
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
@Override
public void widgetSelected(SelectionEvent e) {
updateTableView();
myTableViewer.getTable().setFocus();
}
@Override
public void keyPressed(KeyEvent arg0) {
// do nothing
}
@Override
public void keyReleased(KeyEvent arg0) {
updateTableView();
}
/**
*
* Collect view settings, push to refresh displaying.
*
*/
private void updateTableView() {
myErrorSetup = myLoggingView.getErrorSelection();
myInfoSetup = myLoggingView.getInfoSelection();
myWarnSetup = myLoggingView.getWarnSelection();
setSearchTerm(myLoggingView.getSearchText());
LogModel.getInstance().setSelectedLogSource(myLoggingView.getPlatform());
myTableViewer.refresh();
}
private boolean isLevelSelected(int level) {
boolean returnValue = false;
if ((LogService.LOG_ERROR == level) && myErrorSetup) {
returnValue = true;
} else if ((LogService.LOG_INFO == level) && myInfoSetup) {
returnValue = true;
} else if ((LogService.LOG_WARNING == level) && myWarnSetup) {
returnValue = true;
}
return returnValue;
}
private boolean isSelectedBySearchTerm(String message) {
boolean returnValue = false;
if (null == mySearchTerm || 0 == mySearchTerm.length()) {
// "nothing" matches them all
returnValue = true;
} else if (messageMatchesSearchTerm(message)) {
returnValue = true;
}
return returnValue;
}
private void setSearchTerm(String searchTerm) {
// regular expression enables matching within a text
// search is case insensitive
// Escape all regex expressions except for the *
char[] regexsymbols = { '(', ')', '{', '}', '[', ']', '^', '?', '.', '\\', '$', '|', '+' };
mySearchTerm = searchTerm.toLowerCase();
StringBuffer searchTermBuffer = new StringBuffer(mySearchTerm);
int offset = 0;
for (int i = 0; i < mySearchTerm.length(); i++) {
for (int j = 0; j < regexsymbols.length; j++) {
// Insert '\' before regexsymbol
if (mySearchTerm.charAt(i) == regexsymbols[j]) {
searchTermBuffer.insert(i + offset, "\\");
offset++;
}
}
}
mySearchTerm = searchTermBuffer.toString();
while (mySearchTerm.contains(" ")) {
if (mySearchTerm.indexOf(" ") != mySearchTerm.length() - 1) {
mySearchTerm = mySearchTerm.replaceFirst(" ", ".");
} else {
mySearchTerm = mySearchTerm.replaceFirst(" ", "");
}
}
mySearchTerm = mySearchTerm.replaceAll("\\*", ".*");
mySearchTerm = Filter + mySearchTerm + Filter;
try {
myPattern = Pattern.compile(mySearchTerm);
} catch (PatternSyntaxException e) {
myPattern = Pattern.compile(""); // should not happen
}
}
private boolean messageMatchesSearchTerm(String message) {
// search is case insensitive - see also method 'setSearchTerm'
return myPattern.matcher(message.toLowerCase()).matches();
}
}