1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
\r
3 * in Industry THTH ry.
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.diagram.symbollibrary.ui;
\r
14 import java.nio.CharBuffer;
\r
17 * Default implementation of IFilterStrategy.
\r
20 * It implements simple search semantics with only the special wildcard
\r
21 * characters '*' ( 0 to n any characters) and '?' (any one character)
\r
22 * recognized. In order to allow the filter to pass arbitrary prefixes, the
\r
23 * client has to give a '*' prefix in the filter string. On the contrary, the
\r
24 * client does not have to specify a '*' in order to pass arbitrary suffixes -
\r
25 * arbitrary suffixes are allowed by default by this strategy.
\r
28 * This strategy forces the filter string to lowercase.
\r
30 * TODO: this code is duplicated from org.simantics.browsing.ui.common.views since there was no good way of getting this same. Remove code duplication.
\r
32 * @author Tuukka Lehtonen
\r
34 class DefaultFilterStrategy {
\r
36 private static final boolean DEBUG = false;
\r
38 private static StringBuilder addSearchWord(StringBuilder sb, String pattern) {
\r
40 System.out.println("addSearchWord(" + pattern + ") to '" + sb.toString() + "'");
\r
42 if (pattern == null || pattern.isEmpty())
\r
44 if (sb.length() > 0)
\r
52 private static String toString(CharBuffer cb) {
\r
53 cb.limit(cb.position());
\r
56 System.out.println("toString(" + cb + ")");
\r
57 String result = cb.toString();
\r
58 cb.limit(cb.capacity());
\r
62 public static String toSinglePatternString(String filter, boolean implicitPreAsterisk) {
\r
63 if (!filter.isEmpty()) {
\r
64 // Force searching in lowercase.
\r
65 filter = filter.toLowerCase();
\r
67 // Construct a regular expression from the specified text.
\r
68 String regExFilter = filter
\r
69 .replace("\\", "\\\\") // \ -> \\
\r
70 .replace(".", "\\.") // . -> \.
\r
71 .replace("*", ".*") // * -> Any 0..n characters
\r
72 .replace("?", ".") // ? -> Any single character
\r
73 .replace("+", "\\+") // + -> \+
\r
74 .replace("(", "\\(") // ( -> \(
\r
75 .replace(")", "\\)") // ) -> \)
\r
76 .replace("[", "\\[") // [ -> \[
\r
77 .replace("]", "\\]") // ] -> \]
\r
78 .replace("{", "\\{") // { -> \{
\r
79 .replace("}", "\\}") // } -> \}
\r
80 .replace("^", "\\^") // ^ -> \^
\r
81 .replace("$", "\\$") // $ -> \$
\r
82 .replace("|", ".*|") // $ -> \$
\r
83 //.replace("|", "\\|") // | -> \|
\r
84 .replace("&&", "\\&&") // && -> \&&
\r
87 if (implicitPreAsterisk)
\r
88 if (!regExFilter.startsWith(".*"))
\r
89 regExFilter = ".*" + regExFilter ;
\r
90 if (!regExFilter.endsWith(".*"))
\r
91 regExFilter += ".*" ;
\r
98 public static String defaultToPatternString(String filter, boolean implicitPreAsterisk) {
\r
99 if (filter.isEmpty())
\r
102 CharBuffer buf = CharBuffer.allocate(filter.length()*2);
\r
104 StringBuilder sb = new StringBuilder(filter.length()*2);
\r
105 boolean inQuote = false;
\r
106 int len = filter.length();
\r
107 for (int i = 0; i < len;) {
\r
108 char ch = filter.charAt(i);
\r
110 System.out.println("char[" + i + "]: '" + ch + "'");
\r
115 System.out.println("begin quoted text");
\r
119 System.out.println("end quoted text");
\r
121 addSearchWord(sb, toSinglePatternString( toString(buf), implicitPreAsterisk ));
\r
125 } else if (ch == '\\') {
\r
126 // Next character is escaped, i.e. taken as is.
\r
129 // Unexpected end-of-string
\r
132 ch = filter.charAt(i);
\r
134 System.out.println("append escaped character '" + ch + "'");
\r
139 } else if (ch == ' ') {
\r
142 System.out.println("append char '" + ch + "'");
\r
146 if (buf.position() > 0) {
\r
147 addSearchWord(sb, toSinglePatternString( toString(buf), implicitPreAsterisk ));
\r
153 System.out.println("append char '" + ch + "'");
\r
158 if (buf.position() > 0) {
\r
159 addSearchWord(sb, toSinglePatternString( toString(buf), implicitPreAsterisk ));
\r
164 return sb.toString();
\r