/******************************************************************************* * Copyright (c) 2011 Sebastian Benz. * 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: * Sebastian Benz - initial API and implementation ******************************************************************************/ package de.sebastianbenz.task.ui.views; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Text; import com.google.inject.Inject; import de.sebastianbenz.task.query.Query; import de.sebastianbenz.task.query.QueryInterpreter; import de.sebastianbenz.task.query.QueryStringParser; public class QueryBasedFilter extends ViewerFilter implements ModifyListener{ private class RefreshJob extends Job { public RefreshJob() { super("Query evaluator"); } @Override protected IStatus run(IProgressMonitor monitor) { if(viewer == null){ return Status.OK_STATUS; } Display.getDefault().asyncExec(new Runnable() { public void run() { if(!viewer.getControl().isDisposed()) viewer.refresh(); } }); return Status.OK_STATUS; } } private Viewer viewer; private RefreshJob refreshJob = new RefreshJob(); private String text; @Inject private QueryInterpreter queryInterpreter; @Inject private QueryStringParser queryParser; private Query query; @Override public boolean select(Viewer viewer, Object parentElement, Object element) { this.viewer = viewer; if (!(element instanceof EObject)) { return true; } return queryInterpreter.select(query, (EObject) element); } public void modifyText(ModifyEvent e) { if(e.getSource() instanceof Text){ String newText = ((Text)e.getSource()).getText(); if(!newText.trim().equals(text)){ text = newText; updateQuery(); refreshJob.cancel(); refreshJob.schedule(100); } } } private void updateQuery() { query = queryParser.parse(text); if(query == null || query.getExpression() == null){ expand(1); }else{ expandAll(); } } private void expand(int i) { if (viewer instanceof TreeViewer) { ((TreeViewer) viewer).expandToLevel(i); } } protected void expandAll() { if (viewer instanceof TreeViewer) { ((TreeViewer) viewer).expandAll(); } } }