blob: 359368c40717365b764e86c7d13f6bc74c248627 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2006 IBM Corporation 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:
* IBM Corporation - initial implementation
*******************************************************************************/
package org.eclipse.debug.internal.ui.actions;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.IDebugHelpContextIds;
import org.eclipse.debug.internal.ui.viewers.AsynchronousTreeNavigationDialog;
import org.eclipse.debug.internal.ui.viewers.AsynchronousTreeViewer;
import org.eclipse.debug.internal.ui.viewers.ILabelResult;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.texteditor.IUpdate;
import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
/**
* Action which prompts the user to find/navigate to an element in an async tree.
*/
public class FindElementAction extends Action implements IUpdate {
private AsynchronousTreeViewer fViewer;
private IViewPart fView;
private List fLabelResults;
private Map fElementToResult = new HashMap();
class FindLabelProvider extends LabelProvider {
public FindLabelProvider() {
}
public Image getImage(Object element) {
ILabelResult result = (ILabelResult) fElementToResult.get(element);
if (result != null) {
Image[] images = result.getImages();
if (images != null && images.length > 0) {
return images[0];
}
}
return null;
}
public String getText(Object element) {
ILabelResult result = (ILabelResult) fElementToResult.get(element);
if (result != null) {
String[] labels = result.getLabels();
if (labels != null && labels.length > 0) {
return labels[0];
}
}
return ""; //$NON-NLS-1$
}
}
public FindElementAction(IViewPart view, AsynchronousTreeViewer viewer) {
setText(ActionMessages.FindAction_0);
setId(DebugUIPlugin.getUniqueIdentifier() + ".FindElementAction"); //$NON-NLS-1$
PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IDebugHelpContextIds.FIND_ELEMENT_ACTION);
setActionDefinitionId(IWorkbenchActionDefinitionIds.FIND_REPLACE);
fViewer = viewer;
fView = view;
}
public void run() {
final Object element = fViewer.getControl().getData();
IRunnableWithProgress runnable = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
fLabelResults = fViewer.buildLabels(monitor, element, DebugUIPlugin.removeAccelerators(ActionMessages.FindAction_0));
if (monitor.isCanceled()) {
throw new InterruptedException();
}
}
};
ProgressMonitorDialog dialog = new ProgressMonitorDialog(fView.getSite().getShell());
dialog.setCancelable(true);
try {
dialog.run(true, true, runnable);
} catch (InvocationTargetException e) {
DebugUIPlugin.log(e);
return;
} catch (InterruptedException e) {
return;
}
Iterator iter = fLabelResults.iterator();
while (iter.hasNext()) {
ILabelResult result = (ILabelResult) iter.next();
fElementToResult.put(result.getElement(), result);
}
performFind();
fElementToResult.clear();
fLabelResults.clear();
}
protected void performFind() {
AsynchronousTreeNavigationDialog dialog = new AsynchronousTreeNavigationDialog(fView.getSite().getShell(), new FindLabelProvider(), fElementToResult.keySet().toArray());
dialog.setTitle(ActionMessages.FindDialog_3);
dialog.setMessage(ActionMessages.FindDialog_1);
if (dialog.open() == Window.OK) {
Object[] elements = dialog.getResult();
if (elements.length == 1) {
ILabelResult result = (ILabelResult) fElementToResult.get(elements[0]);
TreePath treePath = result.getTreePath();
if (treePath != null) {
fViewer.setSelection(new TreeSelection(treePath), true, true);
}
}
}
}
public void update() {
setEnabled(fViewer.getInput() != null);
}
}