/*******************************************************************************
 * Copyright (c) 2007, 2012 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.variables;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
import org.eclipse.jdt.debug.core.IJavaVariable;
import org.eclipse.jdt.internal.debug.ui.IJDIPreferencesConstants;
import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
import org.eclipse.jface.preference.IPreferenceStore;

/**
 * Provides static methods for filtering the content in Java views.  By filtering in the
 * content provider rather than in the model the UI does not get updated until after the
 * filtering is done.
 *
 * @since 3.4
 * @see JavaVariableContentProvider
 * @see JavaExpressionContentProvider
 * @see JavaStackFrameContentProvider
 */
public class JavaContentProviderFilter {

	/**
	 * Filters the given array of variables based on preference settings.  Currently
	 * removes static variables and constants if the appropriate preference is set.
	 * @param variables array of variables to filter
	 * @param context the current view's context, required because the preferences are view specific
	 * @return array of filtered variables
	 * @throws DebugException
	 */
	public static Object[] filterVariables(Object[] variables, IPresentationContext context) throws DebugException {
		boolean filterStatics = !includeStatic(context);
		boolean filterConstants = !includeConstants(context);

		if (filterStatics || filterConstants) {
			List<Object> keep = new ArrayList<>(variables.length);
			for (int i = 0; i < variables.length; i++) {
				boolean filter = false;
				if (variables[i] instanceof IJavaVariable){
					IJavaVariable var = (IJavaVariable)variables[i];
					if (var.isStatic()){
						if (var.isFinal()){
							filter = filterConstants;
						} else {
							filter = filterStatics;
						}
					}
				}
				if (!filter){
					keep.add(variables[i]);
				}
			}
			return keep.toArray(new Object[keep.size()]);
		}
		return variables;
	}

	/**
	 * Returns whether static variables should be displayed in the view
	 * identified by the given presentation context.  Checks for a preference
	 * that is specific to the presentation context.
	 *
	 * @param context the context of the view being displayed
	 * @return whether static variable should be displayed
	 */
	private static boolean includeStatic(IPresentationContext context){
		IPreferenceStore store = JDIDebugUIPlugin.getDefault().getPreferenceStore();
		String statics = context.getId() + "." + IJDIPreferencesConstants.PREF_SHOW_STATIC_VARIABLES; //$NON-NLS-1$
		return store.getBoolean(statics);
	}

	/**
	 * Returns whether constants should be displayed in the view
	 * identified by the given presentation context.  Checks for a preference
	 * that is specific to the presentation context.
	 *
	 * @param context the context of the view being displayed
	 * @return whether constants should be displayed
	 */
	private static boolean includeConstants(IPresentationContext context){
		IPreferenceStore store = JDIDebugUIPlugin.getDefault().getPreferenceStore();
		String constants = context.getId() + "." + IJDIPreferencesConstants.PREF_SHOW_CONSTANTS; //$NON-NLS-1$
		return store.getBoolean(constants);
	}
}
