/*
* Created on Jul 2, 2005
*
* Copyright 2005-2010 Ignis Software Tools Ltd. All rights reserved.
*/
package jsystem.treeui;
import java.util.regex.Pattern;
import javax.swing.JTree;
import jsystem.treeui.tree.TestsTreeController;
/**
* Used to filter tests in the tests tree. Use setFilter to set a regular
* excpression of the test name you look for all the other will be filtered.
*
* @author guy.arieli
*
*/
public class TestFilterManager {
private static TestFilterManager manager;
public static TestFilterManager getInstance() {
if (manager == null) {
manager = new TestFilterManager();
}
return manager;
}
/**
* ITAI: The filter and filterRegexp are arrays because we want to support
* AND operator. Since AND is not possible is regular expressions we create
* set of regular expressions.
*/
private Pattern filterRegexp[];
private String[] filter;
private DelaiedUpdater updater = null;
public void init(TestsTreeController ttc) {
updater = new DelaiedUpdater(ttc);
updater.start();
}
/**
* Checks if the given class name matches the filter criteria.
*
* @param className
* The current class name (and test name) to check if matches the
* filter criteria.
* @return True if the classname is NOT match the filter criteria.
*/
public boolean filter(final String className) {
if (filterRegexp == null) {
return false;
}
boolean match = true;
for (Pattern regex : filterRegexp) {
match &= regex.matcher(className).find();
}
return !match;
}
/**
* Sets array of filters. The relationship between the specified filters is
* AND.
*
* @param filter
*/
public void setFilter(final String[] filter) {
if (filter == null || filter.equals("")) {
this.filter = null;
filterRegexp = null;
} else {
this.filter = filter;
filterRegexp = new Pattern[filter.length];
for (int i = 0; i < filter.length; i++) {
filterRegexp[i] = Pattern.compile(filter[i], Pattern.CASE_INSENSITIVE);
}
}
updater.filterChanged(filter);
}
public String[] getFilter() {
return filter;
}
}
/**
* The updater wait for half of second silent in the text field and only then it
* will be updated.
*
* @author guy.arieli
*
*/
class DelaiedUpdater extends Thread {
TestsTreeController ttc;
long lastFilterChangeTime = 0;
boolean updated = true;
boolean isFilterChange = false;
String[] filter = null;
public DelaiedUpdater(TestsTreeController ttc) {
setName("Filter updater thread");
this.ttc = ttc;
}
public void run() {
while (true) {
try {
waitForFilterChange();
ttc.refreshView();
if (isFilterChange) {
continue;
}
JTree tree = ttc.getTree();
int row = 0;
while (row < tree.getRowCount()) {
if (isFilterChange) {
break;
}
tree.expandRow(row);
row++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
private void waitForFilterChange() throws Exception {
while (!isFilterChange) {
Thread.sleep(30);
}
isFilterChange = false;
while (System.currentTimeMillis() - lastFilterChangeTime < 500) {
Thread.sleep(50);
}
}
public void filterChanged(final String[] filter) {
this.filter = filter;
lastFilterChangeTime = System.currentTimeMillis();
isFilterChange = true;
}
}