diff options
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/context/FindVariableDialog.java')
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/context/FindVariableDialog.java | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/context/FindVariableDialog.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/context/FindVariableDialog.java new file mode 100644 index 000000000..92d7a39d7 --- /dev/null +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/actions/context/FindVariableDialog.java @@ -0,0 +1,211 @@ +/******************************************************************************* + * Copyright (c) 2004, 2005 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.context; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.debug.core.DebugException; +import org.eclipse.debug.core.model.IValue; +import org.eclipse.debug.core.model.IVariable; +import org.eclipse.debug.internal.ui.DebugUIPlugin; +import org.eclipse.debug.internal.ui.actions.ActionMessages; +import org.eclipse.debug.internal.ui.viewers.AsynchronousTreeViewer; +import org.eclipse.debug.internal.ui.views.DebugViewDecoratingLabelProvider; +import org.eclipse.debug.internal.ui.views.DebugViewInterimLabelProvider; +import org.eclipse.debug.internal.ui.views.DebugViewLabelDecorator; +import org.eclipse.debug.internal.ui.views.variables.VariablesView; +import org.eclipse.debug.ui.IDebugModelPresentation; +import org.eclipse.debug.ui.IValueDetailListener; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.ILabelProviderListener; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.jface.viewers.ViewerFilter; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.TreeItem; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.internal.ide.StringMatcher; + +public class FindVariableDialog extends Dialog { + + private TableViewer fViewer; + private VariablesView fView; + private Text fText; + private StringMatcher fMatcher; + private int fTextLength; + + private class FindVariableContentProvider implements IStructuredContentProvider { + public void dispose() { + } + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + public Object[] getElements(Object inputElement) { + return getVariables(((AsynchronousTreeViewer) fView.getViewer()).getTree().getItems()); + } + private IVariable[] getVariables(TreeItem[] items) { + List variables= new ArrayList(); + getVariables(items, variables); + return (IVariable[]) variables.toArray(new IVariable[variables.size()]); + } + private void getVariables(TreeItem[] items, List variables) { + for (int i = 0; i < items.length; i++) { + Object data = items[i].getData(); + if (data instanceof IVariable) { + variables.add(data); + } + getVariables(items[i].getItems(), variables); + } + } + } + + private class FindVariableFilter extends ViewerFilter { + public boolean select(Viewer viewer, Object parentElement, Object element) { + if (fMatcher == null) { + return true; + } + try { + String name= ((IVariable) element).getName(); + fMatcher.match(name, 0, fTextLength - 1); + return fMatcher.match(name); + } catch (DebugException e) { + } + return false; + } + } + + private class FindVariableModelPresentation implements IDebugModelPresentation { + public Image getImage(Object element) { + IVariable variable= (IVariable) element; + IDebugModelPresentation presentation= fView.getPresentation(variable.getModelIdentifier()); + return presentation.getImage(element); + } + public String getText(Object element) { + try { + return ((IVariable) element).getName(); + } catch (DebugException e) { + DebugUIPlugin.log(e.getStatus()); + } + return ActionMessages.FindVariableDialog_0; + } + public void setAttribute(String attribute, Object value) {} + public void computeDetail(IValue value, IValueDetailListener listener) {} + public void addListener(ILabelProviderListener listener) {} + public void dispose() {} + public boolean isLabelProperty(Object element, String property) { + return false; + } + public void removeListener(ILabelProviderListener listener) {} + public IEditorInput getEditorInput(Object element) { + return null; + } + public String getEditorId(IEditorInput input, Object element) { + return null; + } + } + + protected FindVariableDialog(Shell parentShell, VariablesView view) { + super(parentShell); + fView= view; + } + + protected Control createDialogArea(Composite parent) { + Composite composite= (Composite) super.createDialogArea(parent); + + Label label= new Label(composite, SWT.NONE); + label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + label.setFont(parent.getFont()); + label.setText(ActionMessages.FindVariableDialog_1); + + fText= new Text(composite, SWT.SINGLE | SWT.BORDER); + fText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + fText.setFont(parent.getFont()); + fText.addModifyListener(new ModifyListener() { + public void modifyText(ModifyEvent e) { + textModified(); + } + }); + + label= new Label(composite, SWT.NONE); + label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + label.setFont(parent.getFont()); + label.setText(ActionMessages.FindVariableDialog_2); + + fViewer= new TableViewer(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); + Table table = fViewer.getTable(); + GridData gridData = new GridData(GridData.FILL_BOTH); + gridData.heightHint= 200; + table.setLayoutData(gridData); + table.setFont(parent.getFont()); + fViewer.setContentProvider(new FindVariableContentProvider()); + fViewer.addFilter(new FindVariableFilter()); + fViewer.setInput(new Object()); + FindVariableModelPresentation presentation = new FindVariableModelPresentation(); + ILabelProvider provider= new DebugViewDecoratingLabelProvider(fViewer, new DebugViewInterimLabelProvider(presentation), new DebugViewLabelDecorator(presentation)); + fViewer.setLabelProvider(provider); + fViewer.addPostSelectionChangedListener(new ISelectionChangedListener() { + public void selectionChanged(SelectionChangedEvent event) { + FindVariableDialog.this.selectionChanged(); + } + }); + + return composite; + } + + private void textModified() { + StringBuffer text = new StringBuffer(fText.getText()); + if (text.length() == 0 || text.charAt(text.length() - 1) != '*') { + text.append("*"); //$NON-NLS-1$ + } + fMatcher= new StringMatcher(text.toString(), true, false); + fTextLength= text.length(); + fViewer.refresh(false); + if (((IStructuredSelection) fViewer.getSelection()).isEmpty()) { + Table table= fViewer.getTable(); + if (table.getItemCount() > 0) { + fViewer.setSelection(new StructuredSelection(table.getItem(0).getData())); + selectionChanged(); + } + } + } + + private void selectionChanged() { + fView.getViewer().setSelection(fViewer.getSelection(), true); + } + + protected void createButtonsForButtonBar(Composite parent) { + createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, + true); + } + + protected void configureShell(Shell newShell) { + newShell.setText(ActionMessages.FindVariableDialog_3); + super.configureShell(newShell); + } + +} |