/*******************************************************************************
 * 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);

}
