package org.eclipse.jdt.internal.debug.ui;

/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp.  All rights reserved.
This file is made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
**********************************************************************/

import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.DebugException;
import org.eclipse.jdt.debug.core.IJavaVariable;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;

/**
 * A filter for viewers that display Java variables.  Filters out variables
 * according to the current preference settings.
 */
public class JavaVariablesViewerFilter extends ViewerFilter {

	/**
	 * Flag indicating whether the current preferences have been loaded.
	 */															
	private boolean fFilterPreferencesLoaded = false;

	/**
	 * The prefix for all preference keys.
	 */
	private String fPreferencePrefix;

	/**
	 * A table containing the current preferences that relate to variable
	 * filtering.
	 */
	private boolean[][] fFilterGrid = new boolean[JDIDebugUIPlugin.fgModeModifierNames.length][JDIDebugUIPlugin.fgAccessModifierNames.length];																									

	public JavaVariablesViewerFilter(String preferencePrefix) {
		setPreferencePrefix(preferencePrefix);
	}

	/**
	 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
	 */
	public boolean select(Viewer viewer, Object parentElement, Object element) {
		if (element instanceof IAdaptable) {
			IJavaVariable var = (IJavaVariable) ((IAdaptable) element).getAdapter(IJavaVariable.class);
			if (var != null) {

				// Never filter out the root of the viewer
				if (element.equals(viewer.getInput())) {
					return true;
				}
				
				// Compare the java modifiers on the variable to the current preferences
				return isVariableVisible(var);
			}
		}
		return true;
	}
	
	public void resetState() {
		fFilterPreferencesLoaded = false;
	}

	private boolean isVariableVisible(IJavaVariable var) {
		
		// Load the preferences if necessary
		if (!fFilterPreferencesLoaded) {
			loadFilterPreferences();
		}
		
		// Determine the column index in the table corresponding to the varaible
		int index = -1;		
		try {
			if (var.isPublic()) {
				index = 0;
			} else if (var.isPackagePrivate()) {
				index = 1;
			} else if (var.isProtected()) {
				index = 2;
			} else if (var.isPrivate()) {
				index = 3;
			} else if (var.isLocal()) {
				index = 4;
			}
		} catch (DebugException de) {
		}
		
		// If there was a problem, default to making the variable visible
		if (index == -1) {
			return true;
		}
		
		// Return whether the variable 
		try {
			return isVariableVisible(var, index);
		} catch (DebugException de) {
			return true;
		}
	}
	
	private boolean isVariableVisible(IJavaVariable var, int columnIndex) throws DebugException {
		boolean staticVar = var.isStatic();
		boolean finalVar = var.isFinal();
		
		// If the variable is static and the static flag is not set, 
		// this variable won't be visible
		if (staticVar) {
			if (!fFilterGrid[0][columnIndex]) {
				return false;
			}
		}
		
		// If the variable is final and the final flag is not set, 
		// this variable won't be visible
		if (finalVar) {
			if (!fFilterGrid[1][columnIndex]) {
				return false;
			}
		}
		
		// If this variable is 'normal' (not static and not final) and the normal flag
		// is not set, this variable won't be visible
		if (!staticVar && !finalVar) {
			if (!fFilterGrid[2][columnIndex]) {
				return false;
			}
		}
		
		// If this variable is synthetic and the synthetic flag is not set,
		// this variable won't be visible
		if (var.isSynthetic()) {
			if (!fFilterGrid[3][columnIndex]) {
				return false;
			}
		}
		
		// Otherwise the variable is visible
		return true;
	}

	private void loadFilterPreferences() {
		IPreferenceStore prefStore = getPreferenceStore();
		for (int i = 0; i < JDIDebugUIPlugin.fgModeModifierNames.length; i++) {
			for (int j = 0; j < JDIDebugUIPlugin.fgAccessModifierNames.length; j++) {
				String prefName = JDIDebugUIPlugin.generateVariableFilterPreferenceName(i, j, getPreferencePrefix());
				boolean value = prefStore.getBoolean(prefName);
				fFilterGrid[i][j] = value;
			}
		}
		fFilterPreferencesLoaded = true;
	}

	private IPreferenceStore getPreferenceStore() {
		return JDIDebugUIPlugin.getDefault().getPreferenceStore();
	}

	private void setPreferencePrefix(String preferencePrefix) {
		fPreferencePrefix = preferencePrefix;
	}

	private String getPreferencePrefix() {
		return fPreferencePrefix;
	}
	
}
