/******************************************************************************* * Copyright (c) 2004, 2011 Tasktop Technologies 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: * Tasktop Technologies - initial API and implementation *******************************************************************************/ package org.eclipse.mylyn.commons.workbench; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.IJobChangeListener; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.progress.WorkbenchJob; /** * @author Mik Kersten * @author Steffen Pingel * @since 3.7 */ public class AdaptiveRefreshPolicy { public static interface IFilteredTreeListener { public void filterTextChanged(String text); } private int refreshDelay = 1500; private final Set<IFilteredTreeListener> listeners = new HashSet<IFilteredTreeListener>(); private String oldText = ""; //$NON-NLS-1$ protected Job refreshJob; @Deprecated public AdaptiveRefreshPolicy(Job refreshJob, Text filterText) { this(refreshJob); } public AdaptiveRefreshPolicy(Job refreshJob) { Assert.isNotNull(refreshJob); this.refreshJob = refreshJob; refreshJob.addJobChangeListener(REFRESH_JOB_LISTENER); } public void dispose() { refreshJob.removeJobChangeListener(REFRESH_JOB_LISTENER); } protected final IJobChangeListener REFRESH_JOB_LISTENER = new IJobChangeListener() { public void aboutToRun(IJobChangeEvent event) { // ignore } public void awake(IJobChangeEvent event) { // ignore } public void done(IJobChangeEvent event) { if (event.getResult().isOK()) { PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { for (IFilteredTreeListener listener : listeners) { listener.filterTextChanged(oldText); } } }); } } public void running(IJobChangeEvent event) { // ignore } public void scheduled(IJobChangeEvent event) { // ignore } public void sleeping(IJobChangeEvent event) { // ignore } }; public void textChanged(String text) { if (text == null || text.equals(oldText)) { return; } refreshJob.cancel(); int delay = 0; int textLength = text.length(); if (textLength > 0) { delay = (int) (this.refreshDelay / (textLength * 0.6)); } refreshJob.schedule(delay); this.oldText = text; } /** * the filter has changed in some way (not the text) */ public void filterChanged() { refreshJob.cancel(); refreshJob.schedule(refreshDelay / 2); } /** * for testing purposes only */ public void internalForceRefresh() { ((WorkbenchJob) refreshJob).runInUIThread(new NullProgressMonitor()); } public void addListener(IFilteredTreeListener listener) { listeners.add(listener); } public void removeListener(IFilteredTreeListener listener) { listeners.remove(listener); } public void setRefreshDelay(int refreshDelay) { this.refreshDelay = refreshDelay; } public int getRefreshDelay() { return refreshDelay; } }