package krasa.grepconsole.folding; import java.util.List; import java.util.regex.Pattern; import krasa.grepconsole.model.GrepExpressionItem; import krasa.grepconsole.plugin.GrepConsoleApplicationComponent; import org.jetbrains.annotations.Nullable; import com.intellij.execution.ConsoleFolding; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.util.text.StringUtil; /** * @author Vojtech Krasa */ public class GrepConsoleFolding extends ConsoleFolding { private GrepConsoleApplicationComponent grepConsoleApplicationComponent; public GrepConsoleFolding(GrepConsoleApplicationComponent grepConsoleApplicationComponent) { this.grepConsoleApplicationComponent = grepConsoleApplicationComponent; } @Override public boolean shouldFoldLine(String line) { try { List<GrepExpressionItem> foldings = grepConsoleApplicationComponent.getCachedFoldingItems(); int cachedMaxLengthToMatch = grepConsoleApplicationComponent.getCachedMaxLengthToMatch(); Integer maxProcessingTimeAsInt = grepConsoleApplicationComponent.getCachedMaxProcessingTimeAsInt(); line = line.substring(0, Math.min(line.length(), cachedMaxLengthToMatch)); CharSequence input = StringUtil.newBombedCharSequence(line, maxProcessingTimeAsInt); for (int i = 0; i < foldings.size(); i++) { GrepExpressionItem grepExpressionItem = foldings.get(i); Pattern unlessPattern = grepExpressionItem.getUnlessPattern(); if (unlessPattern != null && unlessPattern.matcher(input).matches()) { continue; } Pattern pattern = grepExpressionItem.getPattern(); if (pattern != null && pattern.matcher(input).matches()) { return true; } } } catch (ProcessCanceledException e) { } return false; } @Nullable @Override public String getPlaceholderText(List<String> lines) { String s = lines.size() > 1 ? "s" : ""; return " <" + lines.size() + " folded line" + s + ">"; } }