/*=============================================================================#
 # Copyright (c) 2009, 2017 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.internal.r.core;

import java.util.List;

import org.eclipse.statet.jcommons.lang.ObjectUtils;

import org.eclipse.statet.ltk.model.core.elements.IModelElement;
import org.eclipse.statet.ltk.model.core.elements.ISourceElement;
import org.eclipse.statet.ltk.model.core.elements.ISourceUnit;
import org.eclipse.statet.r.core.model.IRElement;
import org.eclipse.statet.r.core.model.IRFrame;
import org.eclipse.statet.r.core.model.IRLangElement;
import org.eclipse.statet.r.core.model.RElementName;


public class FilteredFrame implements IRFrame, IModelElement.Filter {
	
	
	private final IRFrame frame;
	private final ISourceUnit exclude;
	
	
	public FilteredFrame(final IRFrame frame, final ISourceUnit exclude) {
		this.frame= frame;
		this.exclude= exclude;
	}
	
	
	@Override
	public String getFrameId() {
		return this.frame.getFrameId();
	}
	
	@Override
	public int getFrameType() {
		return this.frame.getFrameType();
	}
	
	@Override
	public RElementName getElementName() {
		return this.frame.getElementName();
	}
	
	@Override
	public boolean hasModelChildren(final IModelElement.Filter filter) {
		return this.frame.hasModelChildren((this.exclude != null) ? this : null);
	}
	
	@Override
	public List<? extends IRLangElement> getModelChildren(final IModelElement.Filter filter) {
		return this.frame.getModelChildren((this.exclude != null) ? this : null);
	}
	
	@Override
	public List<? extends IRElement> getModelElements() {
		return this.frame.getModelElements();
	}
	
	@Override
	public List<? extends IRFrame> getPotentialParents() {
		return this.frame.getPotentialParents();
	}
	
	
	@Override
	public boolean include(final IModelElement element) {
		final ISourceUnit su= (element instanceof ISourceElement) ?
				((ISourceElement) element).getSourceUnit() : null;
		return (su == null || !this.exclude.getId().equals(su.getId()) );
	}
	
	
	@Override
	public String toString() {
		final ObjectUtils.ToStringBuilder builder= new ObjectUtils.ToStringBuilder(
				"FilteredFrame", getClass() ); //$NON-NLS-1$
		builder.addProp("frame", this.frame); //$NON-NLS-1$
		builder.addProp("exclude", this.exclude); //$NON-NLS-1$
		return builder.build();
	}
	
}
