--- /dev/null
+package org.eclipse.webbrowser.internal;
+/**********************************************************************
+ * Copyright (c) 2003 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 - Initial API and implementation
+ **********************************************************************/
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.webbrowser.IExternalWebBrowserWorkingCopy;
+import org.eclipse.core.runtime.IProgressMonitor;
+/**
+ *
+ */
+public class BrowserSearcher {
+ private static boolean cancelled;
+ private BrowserSearcher() {
+ super();
+ }
+
+ /**
+ * Search for installed VMs in the file system
+ */
+ protected static List search(Shell shell) {
+ final List foundBrowsers = new ArrayList();
+ final List existingPaths = WebBrowserUtil.getExternalBrowserPaths();
+
+ // select a target directory for the search
+ DirectoryDialog dialog = new DirectoryDialog(shell);
+ dialog.setMessage(WebBrowserUIPlugin.getResource("%selectDirectory"));
+ dialog.setText(WebBrowserUIPlugin.getResource("%directoryDialogTitle"));
+
+ String path = dialog.open();
+ if (path == null)
+ return null;
+
+ cancelled = false;
+
+ final File rootDir = new File(path);
+ ProgressMonitorDialog pm = new ProgressMonitorDialog(shell);
+
+ IRunnableWithProgress r = new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) {
+ monitor.beginTask(
+ WebBrowserUIPlugin.getResource("%searchingTaskName"),
+ IProgressMonitor.UNKNOWN);
+ search(rootDir, existingPaths, foundBrowsers, monitor);
+ monitor.done();
+ if (monitor.isCanceled())
+ setCancelled(true);
+ }
+ };
+
+ try {
+ pm.run(true, true, r);
+ } catch (InvocationTargetException e) {
+ Trace.trace(Trace.SEVERE, "Invocation Exception occured running monitor: " + e);
+ } catch (InterruptedException e) {
+ Trace.trace(Trace.SEVERE, "Interrupted exception occured running monitor: " + e);
+ return null;
+ }
+
+ if (cancelled)
+ return null;
+
+ return foundBrowsers;
+ }
+
+ protected static void setCancelled(boolean b) {
+ cancelled = b;
+ }
+
+ protected static void search(File directory, List existingPaths, List foundBrowsers, IProgressMonitor monitor) {
+ if (monitor.isCanceled())
+ return;
+
+ String[] names = directory.list();
+ List subDirs = new ArrayList();
+
+ for (int i = 0; i < names.length; i++) {
+ if (monitor.isCanceled())
+ return;
+
+ File file = new File(directory, names[i]);
+
+ if (existingPaths.contains(file.getAbsolutePath().toLowerCase()))
+ continue;
+
+ IExternalWebBrowserWorkingCopy wc = WebBrowserUtil.createExternalBrowser(file);
+ if (wc != null)
+ foundBrowsers.add(wc);
+
+ try {
+ monitor.subTask(
+ MessageFormat.format(WebBrowserUIPlugin.getResource("%searching"),
+ new String[] { Integer.toString(foundBrowsers.size()), file.getCanonicalPath()}));
+ } catch (IOException ioe) {
+ }
+
+ if (file.isDirectory()) {
+ if (monitor.isCanceled())
+ return;
+ subDirs.add(file);
+ }
+ }
+ while (!subDirs.isEmpty()) {
+ File subDir = (File) subDirs.remove(0);
+ search(subDir, existingPaths, foundBrowsers, monitor);
+ if (monitor.isCanceled()) {
+ return;
+ }
+ }
+ }
+}
\ No newline at end of file