blob: defafc1a64ceee495b970d2e24533eaa3782957e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 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 API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.debug.ui.actions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.internal.debug.ui.IJDIPreferencesConstants;
import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
import org.eclipse.jdt.internal.debug.ui.JavaDebugOptionsManager;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.IStructuredSelection;
/**
* This abstract class defines the behavior common to actions that allow the
* user to add step filters dynamically, as they are debugging.
*
* @since 2.1
*/
public abstract class AbstractAddStepFilterAction extends ObjectActionDelegate {
/**
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/
@Override
public void run(IAction action) {
// Make sure there is a current selection
IStructuredSelection selection= getCurrentSelection();
if (selection == null) {
return;
}
// For each selected stack frame, add a corresponding active step filter
Iterator<IJavaStackFrame> itr = selection.iterator();
while (itr.hasNext()) {
IJavaStackFrame frame = itr.next();
String pattern = generateStepFilterPattern(frame);
if (pattern != null) {
addActiveStepFilter(pattern);
}
}
}
/**
* Make the specified pattern an active step filter.
*/
private void addActiveStepFilter(String pattern) {
// Get the active & inactive filter preferences and convert them to Lists
IPreferenceStore prefStore = getPreferenceStore();
String[] activeArray = JavaDebugOptionsManager.parseList(prefStore.getString(IJDIPreferencesConstants.PREF_ACTIVE_FILTERS_LIST));
String[] inactiveArray = JavaDebugOptionsManager.parseList(prefStore.getString(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST));
List<String> activeList = new ArrayList<>(Arrays.asList(activeArray));
List<String> inactiveList = new ArrayList<>(Arrays.asList(inactiveArray));
// If the pattern is already in the active list, there's nothing to do
// (it can't/shouldn't be in the inactive list)
if (activeList.contains(pattern)) {
return;
}
// Add the pattern to the active list and update the preference store
activeList.add(pattern);
String activePref = JavaDebugOptionsManager.serializeList(activeList.toArray(new String[activeList.size()]));
prefStore.setValue(IJDIPreferencesConstants.PREF_ACTIVE_FILTERS_LIST, activePref);
// If the pattern was present in the inactive list, remove it since we just
// added it to the active list
if (inactiveList.contains(pattern)) {
inactiveList.remove(pattern);
String inactivePref = JavaDebugOptionsManager.serializeList(inactiveList.toArray(new String[inactiveList.size()]));
prefStore.setValue(IJDIPreferencesConstants.PREF_INACTIVE_FILTERS_LIST, inactivePref);
}
}
/**
* Convenience method to get the preference store.
*/
private IPreferenceStore getPreferenceStore() {
return JDIDebugUIPlugin.getDefault().getPreferenceStore();
}
/**
* Generate an appropriate String pattern for the specified Java stack
* frame or return null if generation failed. For example, the pattern for
* a type might look like, "com. example.MyType", while the pattern for a
* package might look like, "com. example.*".
*
* @param frame the Java stack frame used to generate a String pattern
* @return String the pattern or <code>null</code> if one could not be
* generated
*/
protected abstract String generateStepFilterPattern(IJavaStackFrame frame);
}