package krasa.grepconsole.filter;
import com.intellij.execution.filters.Filter;
import com.intellij.execution.ui.ConsoleViewContentType;
import com.intellij.openapi.project.Project;
import krasa.grepconsole.filter.support.FilterState;
import krasa.grepconsole.filter.support.GrepProcessor;
import krasa.grepconsole.filter.support.MyResultItem;
import krasa.grepconsole.model.GrepExpressionItem;
import krasa.grepconsole.model.Profile;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.List;
/** must be executed in single thread, see #createProcessor */
public class GrepHighlightFilter extends AbstractGrepFilter implements Filter {
private long executionId;
protected ConsoleViewContentType lastTextAttributes = null;
public GrepHighlightFilter(Project project) {
super(project);
}
public GrepHighlightFilter(Profile profile, List<GrepProcessor> grepProcessors) {
super(profile, grepProcessors);
}
@Nullable
@Override
// line can be empty sometimes under heavy load
public Result applyFilter(@Nullable String s, int entireLength) {
int offset = entireLength;
if (s != null) {
offset = entireLength - s.length();
}
FilterState state = super.filter(s, offset);
Result result = null;
if (state != null) {
result = prepareResult(entireLength, state);
}
return result;
}
private Result prepareResult(int entireLength, FilterState state) {
Result result = null;
List<MyResultItem> resultItemList = adjustWholeLineMatch(entireLength, state);
if (resultItemList != null) {
result = new Result(MyResultItem.toIJ(resultItemList));
result.setNextAction(NextAction.CONTINUE_FILTERING);
}
return result;
}
protected List<MyResultItem> adjustWholeLineMatch(int entireLength, FilterState state) {
ConsoleViewContentType textAttributes = state.getConsoleViewContentType();
List<MyResultItem> resultItemList = state.getResultItemList();
if (textAttributes != null) {
lastTextAttributes = textAttributes;
if (resultItemList == null) {
resultItemList = Collections.singletonList(getResultItem(entireLength, state, textAttributes));
} else {
resultItemList.add(getResultItem(entireLength, state, textAttributes));
}
} else if (lastTextAttributes != null && profile.isMultiLineOutput()) {
if (resultItemList == null) {
resultItemList = Collections.singletonList(getResultItem(entireLength, state, lastTextAttributes));
} else {
resultItemList.add(getResultItem(entireLength, state, lastTextAttributes));
}
}
return resultItemList;
}
private MyResultItem getResultItem(int entireLength, FilterState state, ConsoleViewContentType textAttributes) {
return new MyResultItem(state.getOffset(), entireLength, null, textAttributes);
}
@Override
public void onChange() {
super.onChange();
lastTextAttributes = null;
}
@Override
protected boolean shouldAdd(GrepExpressionItem grepExpressionItem) {
return profile.isEnabledHighlighting()
&& !(profile.isEnabledInputFiltering() && grepExpressionItem.isInputFilter());
}
public long getExecutionId() {
return executionId;
}
public void setExecutionId(long executionId) {
this.executionId = executionId;
}
public boolean hasGrepProcessorsForStatusBar() {
final List<GrepProcessor> grepProcessors = getGrepProcessors();
for (GrepProcessor grepProcessor : grepProcessors) {
if (grepProcessor.getGrepExpressionItem().isShowCountInStatusBar()) {
return true;
}
}
return false;
}
public boolean hasGrepProcessorsForConsolePanel() {
final List<GrepProcessor> grepProcessors = getGrepProcessors();
for (GrepProcessor grepProcessor : grepProcessors) {
if (grepProcessor.getGrepExpressionItem().isShowCountInConsole()) {
return true;
}
}
return false;
}
@Override
protected GrepProcessor createProcessor(GrepExpressionItem grepExpressionItem) {
return grepExpressionItem.createThreadUnsafeProcessor();
}
}