blob: 45ba6520d7bd8b0e34f801f67192abb5c3c94a16 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2017 xored software, Inc.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* xored software, Inc. - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.ui.text.folding;
import org.eclipse.dltk.core.IMember;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IModelElementVisitor;
import org.eclipse.dltk.core.ISourceRange;
import org.eclipse.dltk.core.ISourceReference;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.SourceRange;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.jface.preference.IPreferenceStore;
/**
* The implementation of {@link IFoldingBlockProvider} performing folding based
* on the structure of the source file.
*
* @since 3.0
*/
public class ModelFoldingBlockProvider implements IFoldingBlockProvider,
IModelElementVisitor {
@Override
public void initializePreferences(IPreferenceStore preferenceStore) {
}
private IFoldingBlockRequestor requestor;
@Override
public void setRequestor(IFoldingBlockRequestor requestor) {
this.requestor = requestor;
}
@Override
public int getMinimalLineCount() {
return 0;
}
@Override
public void computeFoldableBlocks(IFoldingContent content) {
try {
content.getModelElement().accept(this);
} catch (ModelException e) {
abortFolding(e);
}
}
private void abortFolding(ModelException e) {
if (!e.isDoesNotExist()) {
DLTKUIPlugin.logErrorMessage("Error when computing folding", e);
}
throw new AbortFoldingException();
}
@Override
public boolean visit(IModelElement element) {
if (element instanceof IType || element instanceof IMember) {
reportElement(element);
}
return true;
}
protected void reportElement(IModelElement element) {
if (!(element instanceof ISourceReference)) {
return;
}
try {
final ISourceRange range = ((ISourceReference) element)
.getSourceRange();
if (SourceRange.isAvailable(range) && range.getLength() > 0) {
requestor.acceptBlock(range.getOffset(), range.getOffset()
+ range.getLength(), getKind(element), element,
isFoldedInitially(element));
}
} catch (ModelException e) {
abortFolding(e);
}
}
protected boolean isFoldedInitially(IModelElement element) {
return false;
}
private static enum FoldingBlockKind implements IFoldingBlockKind {
TYPE, METHOD;
@Override
public boolean isComment() {
return false;
}
}
protected IFoldingBlockKind getKind(IModelElement element) {
return element.getElementType() == IModelElement.TYPE ? FoldingBlockKind.TYPE
: FoldingBlockKind.METHOD;
}
}