blob: b1d4f308137550eec7b6e92a30d3965dd56b35d0 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2008, 2020 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;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
import org.eclipse.statet.ltk.ast.core.util.AstSelection;
import org.eclipse.statet.ltk.model.core.LtkModelUtils;
import org.eclipse.statet.ltk.model.core.ModelManager;
import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
import org.eclipse.statet.ltk.model.core.element.SourceStructElement;
import org.eclipse.statet.ltk.model.core.element.SourceUnit;
import org.eclipse.statet.ltk.model.core.element.SourceUnitModelInfo;
/**
* Data/state of LTK based input of a view/editor.
*
* E.g. used for {@link ISelectionWithElementInfoListener} or {@link ShowInContext}
*/
@NonNullByDefault
public class LTKInputData implements ISelection {
protected final SourceUnit inputElement;
protected @Nullable SourceUnitModelInfo inputInfo;
protected final @Nullable ISelectionProvider selectionProvider;
protected ISelection selection;
protected @Nullable AstSelection astSelection;
protected @Nullable SourceStructElement<?, ?> modelSelection;
public LTKInputData(final SourceUnit inputElement, final ISelection selection) {
this.inputElement= inputElement;
this.selectionProvider= null;
this.selection= selection;
}
public LTKInputData(final SourceUnit inputElement, final ISelectionProvider selectionProvider) {
this.inputElement= inputElement;
this.selectionProvider= selectionProvider;
this.selection= selectionProvider.getSelection();
}
public boolean update() {
if (this.selectionProvider != null) {
final ISelection selection= this.selectionProvider.getSelection();
if (!selection.equals(this.selection)) {
this.astSelection= null;
this.modelSelection= null;
}
return true;
}
return false;
}
public LtkModelElement<?> getInputElement() {
return this.inputElement;
}
public @Nullable SourceUnitModelInfo getInputInfo() {
SourceUnitModelInfo inputInfo= this.inputInfo;
if (inputInfo == null) {
inputInfo= this.inputElement.getModelInfo(null, ModelManager.NONE, new NullProgressMonitor());
this.inputInfo= inputInfo;
}
return inputInfo;
}
@Override
public boolean isEmpty() {
return this.selection.isEmpty();
}
public ISelection getSelection() {
return this.selection;
}
public @Nullable AstSelection getAstSelection() {
AstSelection astSelection= this.astSelection;
if (astSelection == null) {
final SourceUnitModelInfo modelInfo;
if (this.selection instanceof ITextSelection && (modelInfo= getInputInfo()) != null) {
final ITextSelection textSelection= (ITextSelection)this.selection;
astSelection= AstSelection.search(modelInfo.getAst().getRoot(),
textSelection.getOffset(), textSelection.getOffset()+textSelection.getLength(),
AstSelection.MODE_COVERING_SAME_LAST );
this.astSelection= astSelection;
}
}
return astSelection;
}
public @Nullable SourceStructElement<?, ?> getModelSelection() {
SourceStructElement<?, ?> modelSelection= this.modelSelection;
if (modelSelection == null) {
final SourceUnitModelInfo modelInfo;
if (this.selection instanceof ITextSelection && (modelInfo= getInputInfo()) != null) {
final ITextSelection textSelection= (ITextSelection)this.selection;
modelSelection= LtkModelUtils.getCoveringSourceElement(modelInfo.getSourceElement(),
textSelection.getOffset(), textSelection.getOffset() + textSelection.getLength() );
this.modelSelection= modelSelection;
}
}
return modelSelection;
}
public boolean isStillValid() {
return true;
}
}