/*=============================================================================# # Copyright (c) 2013-2016 Stephan Wahlbrink (WalWare.de) and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License v1.0 # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # # Contributors: # Stephan Wahlbrink - initial API and implementation #=============================================================================*/ package de.walware.statet.r.ui.util; import org.eclipse.ui.dialogs.SearchPattern; public class RNameSearchPattern extends SearchPattern { private final StringBuilder sb= new StringBuilder(); private boolean fuzzy; private boolean fuzzyLowerCase; public RNameSearchPattern() { super(SearchPattern.RULE_EXACT_MATCH | SearchPattern.RULE_PREFIX_MATCH | SearchPattern.RULE_CAMELCASE_MATCH | SearchPattern.RULE_PATTERN_MATCH | SearchPattern.RULE_BLANK_MATCH); } @Override public void setPattern(String stringPattern) { this.fuzzy= false; this.fuzzyLowerCase= false; if (!stringPattern.isEmpty() && stringPattern.indexOf('_') < 0 && stringPattern.indexOf('.') < 0 && stringPattern.indexOf('*') < 0 && stringPattern.indexOf('?') < 0) { this.fuzzy= true; final char c= stringPattern.charAt(0); if (Character.isLowerCase(c)) { this.fuzzyLowerCase= true; stringPattern= Character.toUpperCase(c) + stringPattern.substring(1); } } super.setPattern(stringPattern); } private String prepareFuzzy(final String text) { this.sb.setLength(0); boolean innerSep= this.fuzzyLowerCase; for (int i= 0; i < text.length(); i++) { final char c= text.charAt(i); if (c == '_' || c == '.') { innerSep= true; } else if (innerSep) { innerSep= false; this.sb.append(Character.toUpperCase(c)); } else { this.sb.append(c); } } return this.sb.toString(); } @Override public boolean matches(String text) { if (this.fuzzy) { text= prepareFuzzy(text); } return super.matches(text); } }