1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.browsing.ui.common.processors;
14 import java.util.Collection;
15 import java.util.Collections;
16 import java.util.HashMap;
18 import java.util.regex.Matcher;
19 import java.util.regex.Pattern;
21 import org.eclipse.core.runtime.Assert;
22 import org.simantics.browsing.ui.BuiltinKeys;
23 import org.simantics.browsing.ui.GraphExplorer;
24 import org.simantics.browsing.ui.NodeContext;
25 import org.simantics.browsing.ui.NodeContext.PrimitiveQueryKey;
26 import org.simantics.browsing.ui.NodeQueryManager;
27 import org.simantics.browsing.ui.PrimitiveQueryUpdater;
28 import org.simantics.browsing.ui.SelectionRequest;
29 import org.simantics.browsing.ui.common.views.DefaultFilterStrategy;
30 import org.simantics.browsing.ui.common.views.IFilterStrategy;
31 import org.simantics.browsing.ui.content.Labeler;
32 import org.simantics.utils.datastructures.Pair;
36 public class FilterSelectionRequestQueryProcessor extends AbstractPrimitiveQueryProcessor<Collection<SelectionRequest>>
37 implements ProcessorLifecycle {
39 HashMap<NodeContext, String> filters = new HashMap<NodeContext, String>();
40 HashMap<NodeContext, Pair<PrimitiveQueryKey<?>, PrimitiveQueryUpdater>> updaters = new HashMap<NodeContext, Pair<PrimitiveQueryKey<?>, PrimitiveQueryUpdater>>();
42 IFilterStrategy filterStrategy;
44 public FilterSelectionRequestQueryProcessor() {
45 this(new DefaultFilterStrategy());
48 public FilterSelectionRequestQueryProcessor(IFilterStrategy filterStrategy) {
49 Assert.isNotNull(filterStrategy, "null filter strategy not allowed");
50 this.filterStrategy = filterStrategy;
53 public IFilterStrategy getFilterStrategy() {
54 return filterStrategy;
57 public void setFilterStrategy(IFilterStrategy filterStrategy) {
58 this.filterStrategy = filterStrategy;
62 public String toString() {
63 return "SelectionRequestProcessor";
67 public Object getIdentifier() {
68 return BuiltinKeys.SELECTION_REQUESTS;
72 public Collection<SelectionRequest> query(PrimitiveQueryUpdater updater, NodeContext context,
73 PrimitiveQueryKey<Collection<SelectionRequest>> key) {
74 updaters.put(context, new Pair<PrimitiveQueryKey<?>, PrimitiveQueryUpdater>(key, updater));
75 return makeFilterRequest(updater, context, filters.get(context));
78 // TODO: evaluate still if this is ok
79 private String adjustFilter(String filter) {
80 String[] tokens = filter.split(" ");
81 // System.out.println("FilterSelectionRequestQueryProcessor.adjustFilter=" + filter);
82 StringBuilder b = new StringBuilder();
84 for(String token : tokens) {
85 // System.out.println("FilterSelectionRequestQueryProcessor.token=" + token);
86 if(!token.startsWith("$")) {
87 if(first) first = false;
93 String result = b.toString();
94 if(result.isEmpty()) return "*";
98 private Collection<SelectionRequest> makeFilterRequest(PrimitiveQueryUpdater updater, NodeContext context, final String filter_) {
99 if (filter_ == null || filter_.isEmpty())
102 final String filter = adjustFilter(filter_);
104 // System.out.println("filter for reg exp = " + filter_ + " -> " + filter);
106 final String regExFilter = filterStrategy.toPatternString(filter);
107 if (regExFilter == null)
110 final Pattern pattern = Pattern.compile(regExFilter);
111 final Matcher matcher = pattern.matcher("");
113 return Collections.singletonList((SelectionRequest) new SelectionRequest() {
115 public Request getRequest() {
116 return Request.FILTER;
120 public boolean isIncluded(NodeQueryManager manager, Object object) {
121 NodeContext context = (NodeContext)object;
122 Labeler labeler = manager.query(context, BuiltinKeys.SELECTED_LABELER);
126 Map<String, String> labels = labeler.getLabels();
127 if (labels.isEmpty())
130 // TODO: only visible columns!
131 for(String s : labels.values()) {
132 //System.out.println("matching " + s);
135 // TODO: remove forced lowercase and leave the case-insensitiveness up to the pattern
136 matcher.reset(s.toLowerCase());
137 if (matcher.matches()) {
145 @SuppressWarnings("unchecked")
147 public <T> T getData() {
154 public String getFilter(NodeContext context) {
155 return filters.get(context);
160 * @param filter a regular expression adhering to {@link Pattern} or
161 * <code>null</code> to disable filtering for the specified context
163 @SuppressWarnings("unchecked")
164 public void setFilter(NodeContext context, String filter) {
165 if (filter == null) {
166 filters.remove(context);
168 filters.put(context, filter);
170 Pair<PrimitiveQueryKey<?>, PrimitiveQueryUpdater> p = updaters.get(context);
172 // FIXME: this is not valid or anything, but prevents NPE crashboombangs for now.
176 if (p.second == null)
177 throw new IllegalArgumentException("context not found in cache");
178 p.second.scheduleReplace(context, (PrimitiveQueryKey<Collection<SelectionRequest>>) p.first, makeFilterRequest(p.second, context, filter));
182 public void attached(GraphExplorer explorer) {
186 public void detached(GraphExplorer explorer) {
190 public void clear() {