blob: 73c18ba4cdbbbd5ccabfd3e27ade1016c4033f8a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.update.internal.ui.wizards;
import java.lang.reflect.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.operation.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.update.core.*;
import org.eclipse.update.internal.ui.*;
import org.eclipse.update.search.*;
/**
* Runs a search query
*/
public class SearchRunner {
private Shell shell;
private IRunnableContext context;
private ISearchProvider searchProvider;
private IUpdateSearchResultCollector collector;
private boolean newSearchNeeded;
public SearchRunner(Shell shell, IRunnableContext context) {
this.shell = shell;
this.context = context;
}
public void setResultCollector(IUpdateSearchResultCollector collector) {
this.collector = collector;
}
public ISearchProvider getSearchProvider() {
return searchProvider;
}
public void setSearchProvider(ISearchProvider searchProvider) {
if (this.searchProvider!=searchProvider)
newSearchNeeded = true;
this.searchProvider = searchProvider;
}
public void setNewSearchNeeded(boolean value) {
newSearchNeeded = value;
}
public boolean isNewSearchNeeded() {
return newSearchNeeded;
}
public void runSearch() {
if (searchProvider==null) return;
try {
context.run(true, true, getSearchOperation(collector));
newSearchNeeded=false;
} catch (InterruptedException e) {
if (!"cancel".equals(e.getMessage()))
UpdateUI.logException(e);
newSearchNeeded=true;
return;
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();
if (t instanceof CoreException) {
CoreException ce = (CoreException)t;
IStatus status = ce.getStatus();
if (status!=null &&
status.getCode()==ISite.SITE_ACCESS_EXCEPTION) {
// Just show this but do not throw exception
// because there may be results anyway.
ErrorDialog.openError(shell,UpdateUI.getString("SearchRunner.connectionError"), //$NON-NLS-1$
null,
status);
return;
}
}
UpdateUI.logException(e);
return;
}
}
private IRunnableWithProgress getSearchOperation(final IUpdateSearchResultCollector collector) {
final UpdateSearchRequest request = searchProvider.getSearchRequest();
IRunnableWithProgress op = new IRunnableWithProgress () {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
request.performSearch(collector, monitor);
} catch (CoreException e) {
throw new InvocationTargetException(e);
} finally {
monitor.done();
if (monitor.isCanceled()) {
newSearchNeeded = true;
throw new InterruptedException("cancel");
}
}
}
};
return op;
}
}