blob: ad73dc2559c9a6d3be903ec37aacba1044686440 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007-2012 Wind River Systems, Inc. and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Ted R Williams (Wind River Systems, Inc.) - initial implementation
*******************************************************************************/
package org.eclipse.cdt.debug.ui.memory.search;
import java.lang.reflect.Method;
import java.math.BigInteger;
import org.eclipse.cdt.debug.ui.memory.search.FindReplaceDialog.IMemorySearchQuery;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.ui.memory.IMemoryRendering;
import org.eclipse.debug.ui.memory.IMemoryRenderingContainer;
import org.eclipse.debug.ui.memory.IRepositionableMemoryRendering;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.search.ui.IQueryListener;
import org.eclipse.search.ui.ISearchQuery;
import org.eclipse.search.ui.ISearchResult;
import org.eclipse.search.ui.ISearchResultListener;
import org.eclipse.search.ui.ISearchResultPage;
import org.eclipse.search.ui.ISearchResultViewPart;
import org.eclipse.search.ui.NewSearchUI;
import org.eclipse.search.ui.SearchResultEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.part.Page;
public class MemorySearchResultsPage extends Page implements ISearchResultPage, IQueryListener {
private TreeViewer fTreeViewer;
private Composite fViewerContainer;
private IQueryListener fQueryListener;
private ISearchResultViewPart fPart;
@Override
public void queryAdded(ISearchQuery query) {
}
@Override
public void queryFinished(ISearchQuery query) {
}
@Override
public void queryRemoved(ISearchQuery query) {
}
@Override
public void queryStarting(ISearchQuery query) {
}
@Override
public String getID() {
return MemorySearchPlugin.getUniqueIdentifier();
}
@Override
public String getLabel() {
if (fQuery == null)
return Messages.getString("MemorySearchResultsPage.LabelMemorySearch"); //$NON-NLS-1$
else
return fQuery.getLabel();
}
@Override
public Object getUIState() {
return fTreeViewer.getSelection();
}
@Override
public void restoreState(IMemento memento) {
}
@Override
public void saveState(IMemento memento) {
}
@Override
public void setID(String id) {
}
@Override
public void setInput(ISearchResult search, Object uiState) {
if (search instanceof MemorySearchResult) {
((MemorySearchResult) search).addListener(new ISearchResultListener() {
@Override
public void searchResultChanged(SearchResultEvent e) {
Display.getDefault().asyncExec(() -> fTreeViewer.refresh());
}
});
}
}
@Override
public void setViewPart(ISearchResultViewPart part) {
fPart = part;
}
@Override
public void createControl(Composite parent) {
fViewerContainer = new Composite(parent, SWT.NULL);
fViewerContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
fViewerContainer.setSize(100, 100);
fViewerContainer.setLayout(new FillLayout());
fTreeViewer = new TreeViewer(fViewerContainer, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
fTreeViewer.setContentProvider(new ITreeContentProvider() {
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
viewer.refresh();
}
@Override
public Object[] getChildren(Object parentElement) {
return new Object[0];
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
return false;
}
@Override
public Object[] getElements(Object inputElement) {
if (fQuery == null)
return new Object[0];
else {
return ((MemorySearchResult) fQuery.getSearchResult()).getMatches();
}
}
});
fTreeViewer.setInput(new Object());
fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(final SelectionChangedEvent event) {
if (event.getSelection() instanceof StructuredSelection) {
IMemoryRenderingContainer containers[] = ((IMemorySearchQuery) fQuery).getMemoryView()
.getMemoryRenderingContainers();
MemoryMatch match = (MemoryMatch) ((StructuredSelection) event.getSelection()).getFirstElement();
if (match != null) {
for (int i = 0; i < containers.length; i++) {
IMemoryRendering rendering = containers[i].getActiveRendering();
if (rendering instanceof IRepositionableMemoryRendering) {
try {
((IRepositionableMemoryRendering) rendering).goToAddress(match.getStartAddress());
} catch (DebugException e) {
MemorySearchPlugin.logError(
Messages.getString("MemorySearchResultsPage.RepositioningMemoryViewFailed"), //$NON-NLS-1$
e);
}
}
if (rendering != null) {
// Temporary, until platform accepts/adds new interface for setting the selection
try {
Method m = rendering.getClass().getMethod("setSelection", //$NON-NLS-1$
new Class[] { BigInteger.class, BigInteger.class });
if (m != null)
m.invoke(rendering, match.getStartAddress(), match.getEndAddress());
} catch (Exception e) {
// do nothing
}
}
}
}
}
}
});
fTreeViewer.setLabelProvider(new ILabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof MemoryMatch)
return "0x" + ((MemoryMatch) element).getStartAddress().toString(16); //$NON-NLS-1$
return element.toString();
}
@Override
public Image getImage(Object element) {
return null;
}
@Override
public void addListener(ILabelProviderListener listener) {
}
@Override
public void dispose() {
}
@Override
public boolean isLabelProperty(Object element, String property) {
return false;
}
@Override
public void removeListener(ILabelProviderListener listener) {
}
});
fQueryListener = createQueryListener();
NewSearchUI.addQueryListener(fQueryListener);
}
private ISearchQuery fQuery;
private IQueryListener createQueryListener() {
return new IQueryListener() {
@Override
public void queryAdded(ISearchQuery query) {
}
@Override
public void queryRemoved(ISearchQuery query) {
queryStarting(query);
}
@Override
public void queryStarting(final ISearchQuery query) {
fQuery = query;
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
fPart.updateLabel();
if (!fTreeViewer.getControl().isDisposed())
fTreeViewer.refresh();
}
});
}
@Override
public void queryFinished(final ISearchQuery query) {
}
};
}
@Override
public void dispose() {
fTreeViewer.getControl().dispose();
fViewerContainer.dispose();
}
@Override
public Control getControl() {
return fViewerContainer;
}
@Override
public void setActionBars(IActionBars actionBars) {
}
@Override
public void setFocus() {
}
}