/*******************************************************************************
* Copyright (c) 2012 Arapiki Solutions Inc.
* 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:
* "Peter Smith <psmith@arapiki.com>" - initial API and
* implementation and/or initial documentation
*******************************************************************************/
package com.buildml.eclipse.files;
import com.buildml.eclipse.bobj.UIDirectory;
import com.buildml.eclipse.bobj.UIFile;
import com.buildml.eclipse.bobj.UIInteger;
import com.buildml.eclipse.utils.IVisibilityProvider;
import com.buildml.model.types.FileSet;
/**
* An adapter class to allow a FileSet to be used as the visibility provider for
* a VisibilityTreeViewer control.
*
* @author "Peter Smith <psmith@arapiki.com>"
*/
public class FilesEditorVisibilityProvider implements IVisibilityProvider {
/*=====================================================================================*
* FIELDS/TYPES
*=====================================================================================*/
/**
* The FileSet containing the visible/non-visible state of each path. If the path
* is in this set, it's visible, else it's non-visible.
*/
private FileSet primaryFilterSet;
/**
* A secondary filterSet which can be applied in conjunction with the first. Note that
* this filter set is provided as-is and won't be modified by the setVisibility() method.
* It's use is to further filter out elements after the primary filter set (filterSet)
* has been applied.
*/
private FileSet secondaryFilterSet;
/*=====================================================================================*
* CONSTRUCTORS
*=====================================================================================*/
/**
* Create a new FilesEditorVisibilityProvider, which can be used in conjunction with
* a VisibilityTreeViewer to determine which elements are visible, versus which are
* non-visible (or greyed out).
*
* @param filterSet The FileSet specifying the visibility state of each path.
*/
public FilesEditorVisibilityProvider(FileSet filterSet)
{
this.primaryFilterSet = filterSet;
}
/*=====================================================================================*
* PUBLIC METHODS
*=====================================================================================*/
/* (non-Javadoc)
* @see com.buildml.eclipse.utils.IVisibilityProvider#isVisible(java.lang.Object)
*/
@Override
public boolean isVisible(Object element) {
if ((element instanceof UIFile) || (element instanceof UIDirectory)) {
UIInteger uiInt = (UIInteger)element;
int fileId = uiInt.getId();
/* is this file a member of both primaryFilterSet and secondaryFilterSet. */
return (primaryFilterSet.isMember(fileId) &&
((secondaryFilterSet == null) || secondaryFilterSet.isMember(fileId)));
}
return false;
}
/*-------------------------------------------------------------------------------------*/
/* (non-Javadoc)
* @see com.buildml.eclipse.utils.IVisibilityProvider#setVisibility(java.lang.Object, boolean)
*/
@Override
public void setVisibility(Object element, boolean visible) {
if ((element instanceof UIFile) || (element instanceof UIDirectory)) {
UIInteger uiInt = (UIInteger)element;
if (visible) {
primaryFilterSet.addSubTree(uiInt.getId());
} else {
primaryFilterSet.removeSubTree(uiInt.getId());
}
}
}
/*-------------------------------------------------------------------------------------*/
/**
* Set the primary FilterSet that determines which packages/scopes we want to
* display.
* @param filter The new primary filter set.
*/
public void setPrimaryFilterSet(FileSet filter) {
primaryFilterSet = filter;
}
/*-------------------------------------------------------------------------------------*/
/**
* @return The primary filter set.
*/
public FileSet getPrimaryFilterSet() {
return primaryFilterSet;
}
/*-------------------------------------------------------------------------------------*/
/**
* Set the secondary FileSet that determine which packages/scopes we want to
* display.
* @param filter The new secondary filter set.
*/
public void setSecondaryFilterSet(FileSet filter) {
secondaryFilterSet = filter;
}
/*-------------------------------------------------------------------------------------*/
/**
* @return The secondary filter set.
*/
public FileSet getSecondaryFilterSet() {
return secondaryFilterSet;
}
/*-------------------------------------------------------------------------------------*/
}