| /*=============================================================================# |
| # Copyright (c) 2014, 2021 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.ltk.ui.sourceediting; |
| |
| import java.util.List; |
| |
| import org.eclipse.jface.viewers.ITreeContentProvider; |
| import org.eclipse.jface.viewers.Viewer; |
| |
| import org.eclipse.statet.jcommons.lang.NonNull; |
| import org.eclipse.statet.jcommons.lang.NonNullByDefault; |
| import org.eclipse.statet.jcommons.lang.Nullable; |
| |
| import org.eclipse.statet.ltk.core.SourceModelStamp; |
| import org.eclipse.statet.ltk.model.core.element.LtkModelElementFilter; |
| import org.eclipse.statet.ltk.model.core.element.SourceStructElement; |
| import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo; |
| |
| |
| @NonNullByDefault |
| public class OutlineContentProvider implements ITreeContentProvider { |
| |
| |
| private static final @NonNull SourceStructElement<?, ?>[] NO_CHILDREN= new @NonNull SourceStructElement[0]; |
| |
| |
| public interface OutlineContent { |
| |
| @Nullable SourceUnitModelInfo getModelInfo(Object inputElement); |
| |
| @Nullable LtkModelElementFilter<? super SourceStructElement<?, ?>> getContentFilter(); |
| |
| } |
| |
| |
| private final OutlineContent content; |
| |
| |
| public OutlineContentProvider(final OutlineContent content) { |
| this.content= content; |
| } |
| |
| |
| protected final OutlineContent getContent() { |
| return this.content; |
| } |
| |
| public @Nullable SourceModelStamp getStamp(final Object inputElement) { |
| final SourceUnitModelInfo modelInfo= getContent().getModelInfo(inputElement); |
| return (modelInfo != null) ? modelInfo.getStamp() : null; |
| } |
| |
| @Override |
| public void inputChanged(final Viewer viewer, final @Nullable Object oldInput, final @Nullable Object newInput) { |
| } |
| |
| @Override |
| public void dispose() { |
| } |
| |
| |
| protected SourceStructElement[] getElements(final @Nullable SourceUnitModelInfo modelInfo) { |
| if (modelInfo != null) { |
| final List<? extends SourceStructElement<?, ?>> children= modelInfo.getSourceElement() |
| .getSourceChildren(getContent().getContentFilter()); |
| return children.toArray(new @NonNull SourceStructElement[children.size()]); |
| } |
| return NO_CHILDREN; |
| } |
| |
| protected @Nullable SourceStructElement getParent(final SourceStructElement<?, ?> element) { |
| return element.getSourceParent(); |
| } |
| |
| protected boolean hasChildren(final @Nullable SourceStructElement<?, ?> element) { |
| return (element != null |
| && element.hasSourceChildren(getContent().getContentFilter()) ); |
| } |
| |
| protected SourceStructElement[] getChildren(final @Nullable SourceStructElement<?, ?> element) { |
| if (element != null) { |
| final List<? extends SourceStructElement> children= element |
| .getSourceChildren(getContent().getContentFilter()); |
| return children.toArray(new @NonNull SourceStructElement[children.size()]); |
| } |
| return NO_CHILDREN; |
| } |
| |
| |
| @Override |
| public @NonNull Object[] getElements(final Object inputElement) { |
| return getElements(getContent().getModelInfo(inputElement)); |
| } |
| |
| @Override |
| public @Nullable Object getParent(final Object element) { |
| return getParent((SourceStructElement<?, ?>)element); |
| } |
| |
| @Override |
| public boolean hasChildren(final Object element) { |
| return hasChildren((SourceStructElement<?, ?>)element); |
| } |
| |
| @Override |
| public @NonNull Object[] getChildren(final Object element) { |
| return getChildren((SourceStructElement<?, ?>)element); |
| } |
| |
| } |