blob: 920d66c305ab9419823a52dbea445df34d57d14a [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2000, 2021 IBM Corporation 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.
#
# SPDX-License-Identifier: EPL-2.0
#
# Contributors:
# IBM Corporation - org.eclipse.jdt: initial API and implementation
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.ltk.ui.sourceediting;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
import org.eclipse.statet.ecommons.ui.dialogs.DialogUtils;
import org.eclipse.statet.ecommons.ui.dialogs.QuickTreeInformationControl;
import org.eclipse.statet.internal.ltk.ui.LTKUIPlugin;
import org.eclipse.statet.ltk.model.core.element.LtkModelElement;
import org.eclipse.statet.ltk.model.core.element.LtkModelElementFilter;
import org.eclipse.statet.ltk.model.core.element.SourceElement;
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;
import org.eclipse.statet.ltk.ui.LtkActions;
import org.eclipse.statet.ltk.ui.sourceediting.actions.OpenDeclaration;
/**
* Show outline in light-weight control.
*/
@NonNullByDefault
public abstract class QuickOutlineInformationControl extends QuickTreeInformationControl {
protected static final String INHERITED_COLOR_NAME= "org.eclipse.jdt.ui.ColoredLabels.inherited"; //$NON-NLS-1$
protected class QuickOutlineContent implements OutlineContentProvider.OutlineContent {
public QuickOutlineContent() {
}
@Override
public @Nullable SourceUnitModelInfo getModelInfo(final Object input) {
return QuickOutlineInformationControl.this.getModelInfo(input);
}
@Override
public @Nullable LtkModelElementFilter<? super SourceStructElement<?, ?>> getContentFilter() {
return QuickOutlineInformationControl.this.getContentFilter();
}
}
private final OpenDeclaration opener;
private OutlineContentProvider contentProvider;
private boolean requireFullName;
/**
* Creates a new outline information control.
*
* @param parent the parent shell
* @param shellStyle the additional styles for the shell
* @param commandId the id of the command that invoked this control or <code>null</code>
*/
public QuickOutlineInformationControl(final Shell parent,
final String commandId, final int pageCount,
final OpenDeclaration opener) {
super(parent, SWT.RESIZE, true, commandId, pageCount);
this.opener= opener;
}
public abstract String getModelTypeId();
@Override
protected IDialogSettings getDialogSettings() {
return DialogUtils.getDialogSettings(LTKUIPlugin.getInstance(), "EditorStructurePopup"); //$NON-NLS-1$
}
@Override
protected String getDescription(final int page) {
if (getCommandId() == LtkActions.SHOW_QUICK_SOURCE_OUTLINE_COMMAND_ID) {
return "Document Outline";
}
if (getCommandId() == LtkActions.SHOW_QUICK_ELEMENT_OUTLINE_COMMAND_ID) {
return "Object Outline";
}
return ""; //$NON-NLS-1$
}
@Override
protected void setMatcherString(final String pattern, final boolean update) {
this.requireFullName= (pattern.indexOf('*') >= 0);
super.setMatcherString(pattern, update);
}
@Override
protected String getElementName(final IAdaptable element) {
if (element instanceof LtkModelElement && !this.requireFullName) {
return ((LtkModelElement<?>)element).getElementName().getSegmentName();
}
return super.getElementName(element);
}
@Override
protected void configureViewer(final TreeViewer viewer) {
this.contentProvider= createContentProvider();
viewer.setContentProvider(this.contentProvider);
}
protected OutlineContentProvider createContentProvider() {
return new OutlineContentProvider(new QuickOutlineContent());
}
protected @Nullable SourceUnitModelInfo getModelInfo(final Object input) {
if (input instanceof SourceUnit) {
return ((SourceUnit) input).getModelInfo(getModelTypeId(), 0, null);
}
return null;
}
protected @Nullable LtkModelElementFilter<? super SourceStructElement<?, ?>> getContentFilter() {
return null;
}
protected int getInitialIterationPage(final SourceElement<?> element) {
return 0;
}
@Override
public void setInput(final Object information) {
if (information instanceof SourceElement) {
final SourceElement<?> element= (SourceElement<?>)information;
final SourceUnit su= element.getSourceUnit();
if (su != null) {
inputChanged(getInitialIterationPage(element), su, element);
return;
}
}
inputChanged(0, null, null);
}
@Override
protected void openElement(final Object element) throws CoreException {
if (element instanceof SourceElement) {
this.opener.open((SourceElement<?>)element, true);
}
}
}