/******************************************************************************
* Copyright (C) 2012 Jonah Graham
*
* 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:
* Jonah Graham <jonah@kichwacoders.com> - initial API and implementation
******************************************************************************/
package org.python.pydev.debug.ui.variables;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.ui.IDebugView;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IActionDelegate2;
import org.eclipse.ui.IViewActionDelegate;
import org.eclipse.ui.IViewPart;
import org.python.pydev.debug.model.PyVariable;
import org.python.pydev.debug.model.PyVariablesPreferences;
/**
* Based on org.eclipse.jdt.internal.debug.ui.heapwalking.AllReferencesInViewActionDelegate and similar
* classes that provide similar filtering functionality for java debugging
*/
abstract public class AbstractShowReferencesActionDelegate extends ViewerFilter implements IPropertyChangeListener,
IActionDelegate2,
IViewActionDelegate {
private IAction fAction;
private IViewPart fView;
protected StructuredViewer getStructuredViewer() {
if (fView == null) {
return null;
}
IDebugView view = (IDebugView) fView.getAdapter(IDebugView.class);
if (view != null) {
Viewer viewer = view.getViewer();
if (viewer instanceof StructuredViewer) {
return (StructuredViewer) viewer;
}
}
return null;
}
public AbstractShowReferencesActionDelegate() {
super();
}
@Override
public void run(IAction action) {
boolean checked = action.isChecked();
setShowReferences(checked);
StructuredViewer structuredViewer = getStructuredViewer();
if (structuredViewer != null) {
ViewerFilter[] filters = structuredViewer.getFilters();
boolean alreadyAdded = false;
for (ViewerFilter filter : filters) {
if (filter == this) {
alreadyAdded = true;
break;
}
}
if (!alreadyAdded) {
structuredViewer.addFilter(this);
} else {
// addFilter (above) does a refresh, so only
// force a refresh if we aren't adding
structuredViewer.refresh();
}
}
}
@Override
public void init(IAction action) {
fAction = action;
action.setChecked(isShowReference());
PyVariablesPreferences.addPropertyChangeListener(this);
run(fAction);
}
@Override
public void init(IViewPart view) {
fView = view;
run(fAction);
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
}
@Override
public void dispose() {
PyVariablesPreferences.removePropertyChangeListener(this);
}
@Override
public void runWithEvent(IAction action, Event event) {
run(action);
}
@Override
public void propertyChange(PropertyChangeEvent event) {
String property = event.getProperty();
if (isShowReferenceProperty(property)) {
if (fAction != null) {
fAction.setChecked(isShowReference());
run(fAction);
}
}
}
/**
* Return true if property (as a string) refers to the property being tracked.
* @param property
* @return
*/
abstract protected boolean isShowReferenceProperty(String property);
/**
* Return true if the property is true
* @return
*/
abstract protected boolean isShowReference();
/**
* Set the property
* @param checked
*/
abstract protected void setShowReferences(boolean checked);
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
if (isShowReference()) {
return true;
} else {
if (element instanceof PyVariable) {
PyVariable variable = (PyVariable) element;
try {
String name = variable.getName();
return select(viewer, parentElement, variable, name);
} catch (DebugException e) {
// Ignore error, if we get one, don't filter
}
}
return true;
}
}
/**
* Convenience method that is called by {@link #select(Viewer, Object, Object)} with the PyVariable
* extracted
*/
protected boolean select(Viewer viewer, Object parentElement, PyVariable variable, String variableName) {
return true;
}
}